单源点最短路径Bellman算法实现
2017-05-09 19:00
351 查看
一、数据集形式
其中:6105(节点个数) 7035(边数)
0(id) 1609(起始边) 1622(终边) 57.403187(权重)
二、数据集
数据集下载链接三、实现代码
#include "stdafx.h" #include "time.h" #include <fstream> #include<iostream> #include <stack> #include <queue> #include<algorithm> using namespace std; int nodeNumber; int edgeNumber; #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" class CTreeNode { public: CTreeNode() {} ~CTreeNode() {} int value; double weight; CTreeNode *next; }; class CTree { public: CTree() { weight = 65535; } ~CTree() {} int value; CTreeNode *next; CTree *before; double weight; }; 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].before = NULL; } tree[0].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; } queue<CTree *> myQ; void Bellman(CTree *t, CTree *tree) { CTreeNode *p = t->next; while (p!=NULL) { //链接的节点已经完成,不做任何改变 if (t->weight!=65535&&tree[p->value].weight>t->weight+p->weight) { //cout << tree[p->value].value << " "; tree[p->value].weight = t->weight + p->weight; tree[p->value].before = t; //Bellman(tree, p->value); myQ.push(&tree[p->value]); } p = p->next; } } void Bell(CTree *tree) { myQ.push(&tree[0]); while (!myQ.empty()) { Bellman(myQ.front(),tree); myQ.pop(); } } int main() { //构建图 CTree *tree = createTree(PATH); double useTime; clock_t start, finish; start = clock(); //算法 Bell(tree); finish = clock(); useTime = (double)(finish - start) / CLOCKS_PER_SEC * 1000; printf("%f 毫秒\n", useTime); system("pause"); return 0; }
相关文章推荐
- 最短路径算法—Bellman-Ford(贝尔曼-福特)算法分析与实现(C/C++)
- 图论;单源最短路径;拓扑排序+松弛(有向无回路);Bellman-Ford(回路,负权回路)Dijkstra(无负权,可回路);可以用最小堆实现算法的优化;
- 最短路径算法—Bellman-Ford(贝尔曼-福特)算法分析与实现(C/C++)
- 最短路径算法—Bellman-Ford(贝尔曼-福特)算法分析与实现(C/C++)
- 最短路径算法—Bellman-Ford(贝尔曼-福特)算法分析与实现(C/C++)
- 单源点最短路径算法的设计与实现
- 最短路径算法—Bellman-Ford(贝尔曼-福特)算法分析与实现(C/C++)
- 单源点最短路径算法:Bellman-Ford算法
- 最短路径算法—Bellman-Ford(贝尔曼-福特)算法分析与实现(C/C++)
- 最短路径算法—Bellman-Ford(贝尔曼-福特)算法分析与实现(C/C++)
- 最短路径算法—Bellman-Ford(贝尔曼-福特)算法分析与实现(C/C++)
- java实现图的最短路径(SP)的贝尔曼福特(Bellman-Ford)算法
- 图论;单源最短路径;拓扑排序+松弛(有向无回路);Bellman-Ford(回路,负权回路);Dijkstra(无负权,可回路);可以用最小堆实现算法的优化;
- 图论;单源最短路径;拓扑排序+松弛(有向无回路);Bellman-Ford(回路,负权回路);Dijkstra(无负权,可回路);可以用最小堆实现算法的优化;
- 最短路径实现算法Bellman-Ford+Dijstra+Floyd
- Bellman-ford算法 实现源点最短路径 允许路径中有负权值
- 最短路径算法—Bellman-Ford(贝尔曼-福特)算法分析与实现(C/C++)
- Bellman-Ford 最短路径算法 图示与实现
- 最短路径算法比较(Dijkstra、Bellman-Ford、SPFA)及实现(Java)
- Bellman-Ford 算法实现单源最短路径