单源点最短路径Dijkstra方法实现

来源:互联网 发布:js onclick 参数 this 编辑:程序博客网 时间:2024/05/29 09:40

一、数据集形式

这里写图片描述
其中:6105(节点个数) 7035(边数)
0(id) 1609(起始边) 1622(终边) 57.403187(权重)

二、数据集

数据集下载链接

三、实现代码

// Dijkstra.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include "time.h"#include <fstream>#include<iostream>#include <stack>#include<algorithm>using namespace std;//#define PATH "E://dataset//MapSet//MinCreateTree//Testnew.txt"//#define PATH "E://dataset//MapSet//MinCreateTree//Ol.txt"//#define PATH "E://dataset//MapSet//MinCreateTree//TGRoad.txt"//#define PATH "E://dataset//MapSet//MinCreateTree//California.txt"//#define PATH "E://dataset//MapSet//MinCreateTree//San.txt"//#define PATH "E://dataset//MapSet//MinCreateTree//NA.txt"int nodeNumber;int edgeNumber;class CWeightSort {public:    int value;    double weight;    CWeightSort *before;    CWeightSort *next;};class CTreeNode{public:    CTreeNode()    {}    ~CTreeNode() {}    int value;    double  weight;    CTreeNode *next;};class CTree{public:    CTree() {        smallWeigth = NULL;    }    ~CTree() {}    int value;    CTreeNode *next;    CTree *before;    CWeightSort *smallWeigth;    bool state;};CTree* createTree(char* filename){    CTree *tree;    ifstream ReadFile;    int temp;    ReadFile.open(filename, ios::in);//ios::in 表示以只读的方式读取文件    ReadFile >> nodeNumber;//第一个字符是数组长度    ReadFile >> edgeNumber;    tree = new CTree[nodeNumber];    //为树赋初值    for (int i = 0; i < nodeNumber; i++)    {        tree[i].next = NULL;        tree[i].value = i;        tree[i].state = true;        tree[i].before = NULL;    }    tree[0].smallWeigth = new CWeightSort;    tree[0].smallWeigth->weight = 0;    CTreeNode *nt;    while (!ReadFile.eof())            //按空格读取,遇到空白符结束    {        nt = new CTreeNode();       //读出的数据新建一个节点        ReadFile >> temp;        ReadFile >> temp;        ReadFile >> (nt->value);        ReadFile >> (nt->weight);        nt->next = tree[temp].next;        tree[temp].next = nt;    }    return tree;}class CQueue {                                  //一个保持队形的队列结构public:    CQueue() {        que = new CWeightSort();        que->next = NULL;    }    void Add(CWeightSort *nq) {        //将新节点按顺序插入到队列上        CWeightSort *q = que;        while (q->next != NULL)        {            if (nq->weight < q->next->weight)            {                q->next->before = nq;                nq->next = q->next;                nq->before = q;                q->next = nq;                break;            }            q = q->next;        }        if (q->next == NULL)        {            nq->next = q->next;            nq->before = q;            q->next = nq;        }    }    CWeightSort * del(CWeightSort *nq)    {        nq->before->next = nq->next;        if (nq->next != NULL)            nq->next->before = nq->before;        return nq;    }    bool empty()    {        if (que->next == NULL)            return true;        return false;    }    CWeightSort *que;};CTree* Dijkstra(CTree *tree){    CQueue myQue;    CWeightSort *myi=new CWeightSort;    myi->value = 0;    myi->before = NULL;    myQue.Add(myi);    CWeightSort *nt=NULL;    while (!myQue.empty())    {        nt = myQue.del(myQue.que->next);        //cout << nt->value << "(" << nt->weight << ")" << " ";        //标记这个节点为已经访问状态        tree[nt->value].state = false;        CTreeNode *p = tree[nt->value].next;        while (p!=NULL)        {            //链接的节点已经完成,不做任何改变            if (tree[p->value].state)            {                //链接的节点,没有更小的值                if (tree[p->value].smallWeigth == NULL)                {                    CWeightSort *node = new CWeightSort;                    node->value = p->value;                    node->weight = tree[nt->value].smallWeigth->weight + p->weight;                    tree[p->value].smallWeigth = node;                    tree[p->value].before = &tree[nt->value];                    myQue.Add(node);                }                //链接的节点,存在更小的值                else if (tree[p->value].smallWeigth->weight>tree[nt->value].smallWeigth->weight+p->weight)                {                    CWeightSort *node=myQue.del(tree[p->value].smallWeigth);                    node->value = p->value;                    node->weight = tree[nt->value].smallWeigth->weight + p->weight;                    tree[p->value].smallWeigth = node;                    tree[p->value].before = &tree[nt->value];                    myQue.Add(node);                }            }            p = p->next;        }    }    return &tree[nt->value];}int main(){    //构建图    CTree *tree = createTree(PATH);    double useTime;    clock_t start, finish;    start = clock();    //算法    CTree* m=Dijkstra(tree);    finish = clock();    useTime = (double)(finish - start) / CLOCKS_PER_SEC * 1000;    printf("%f 毫秒\n", useTime);    system("pause");    return 0;}
0 0
原创粉丝点击