单源点最短路径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
- 单源点最短路径Dijkstra方法实现
- 单源点最短路径Dijkstra算法的JAVA实现
- 单源点最短路径Dijkstra算法的JAVA实现
- 单源点最短路径Dijkstra的java实现
- 单源点最短路径----Dijkstra算法
- 单源点最短路径(dijkstra算法)
- Dijkstra求解单源点最短路径
- Dijkstra 邻接矩阵 单源点最短路径
- 单源点最短路径算法(dijkstra)
- 单源点最短路径问题(Dijkstra算法)
- 单源点最短路径Dijkstra和Bellmanford
- 【数据结构】算法7.15 Dijkstra算法 单源点最短路径
- 单源点最短路径的Dijkstra算法
- 最短路径(Dijkstra算法)也就是单源点问题!
- Dijkstra模板求单源点最短路径
- dijkstra算法求解单源点最短路径
- 单源点最短路径
- 单源点最短路径
- jenkins使用Git为源码管理(windows master && linux slave)
- Hbase1.2.5 hadoop2.7.3 importsv实例
- mysql插入数据后返回自增ID的方法,last_insert_id(),selectkey
- c++第六次作业
- angular2——发布angular2模块,服务
- 单源点最短路径Dijkstra方法实现
- TensorFlow实现word2vec 详细代码解释
- Linux新手应该知道的26个命令
- Sphinx 配置文件的说明【备忘】
- 程序员面试宝典第一章总结
- Bit Functions
- 大学还在,读书人却没有了
- GBK转成utf-8,java实现及讲解
- 启动eclipse出现failed to load the jni shared library解决办法