单源最短路径算法
来源:互联网 发布:windows bat日期加减 编辑:程序博客网 时间:2024/06/16 14:21
Bellman-Ford算法
struct Node{ int distance; int prev;};void PrintPath(Node* node, int source, int index){ if (node[index].index == source) { printf("%4d", source); return; } PrintPath(node, source, node[index].prev); printf("%4d", index);}int BellmanFord(int** matrix, int node_num, int source, int dest){ Node* node = new Node[node_num]; for (int i = 0; i < node_num; i++) { node[i].distance=100; node[i].prev = -1; } node[source].distance = 0; for (int t = 0; t < node_num; t++) { for (int i = 0; i < node_num; i++) { for (int k = 0; k < node_num; k++) { if (matrix[i][k] > -5 && matrix[i][k] + node[i].distance < node[k].distance) { node[k].distance = matrix[i][k] + node[i].distance; node[k].prev = i; } } } } for (int i = 0; i < node_num; i++) { for (int k = 0; k < node_num; k++) { if (matrix[i][k] > 0 && matrix[i][k] + node[i].distance < node[k].distance) { return false; } } } for (int i = 0; i < node_num; i++) { printf("distance from %d to %d is %d\n", source, i, node[i].distance); } PrintPath(node, source, dest); return true;}int main(){ int num_node, num_vert; int binary_vertex; FILE* fp = fopen("input.txt", "r"); char buf[1024]; if (fscanf(fp, "%d %d %d\n", &num_node, &num_vert, &binary_vertex) != 3) { fprintf(stderr, "\nfscanf error: %s: %d\n", strerror(errno), errno); exit(1); } int** matrix = new int*[num_node]; for (int i = 0; i < num_node; i++) { matrix[i] = new int[num_node]; } for (int i = 0; i < num_node; i++) { for (int j = 0; j < num_node; j++) { matrix[i][j] = -100; } } while (fgets(buf, 1024, fp) != NULL) { int begin, end; int weight; if (sscanf(buf, "%d %d %d\n", &begin, &end,&weight) != 3) { fprintf(stderr, "\nsscanf error: %s: %d\n", strerror(errno), errno); exit(1); } if (binary_vertex == 1) { matrix[end][begin] = weight; } matrix[begin][end] = weight; } for (int i = 0; i < num_node; i++) { for (int j = 0; j < num_node; j++) { printf("%8d", matrix[i][j]); } printf("\n"); } int source = 0; int dest = 1; int dis = BellmanFord(matrix, num_node, source, dest); return 0;}
Dijkstra算法
struct Node{ int index; int distance; int prev;};struct Compare { bool operator() (Node a, Node b) { if (a.distance > b.distance) { return true; } else { return false; } }};void PrintPath(Node* node, int source, int index){ if (node[index].index == source) { printf("%4d", source); return; } PrintPath(node, source, node[index].prev); printf("%4d", index);}int Dijkstra(int** matrix, int node_num, int source, int dest){ Node* node = new Node[node_num]; for (int i = 0; i < node_num; i++) { node[i].index = i; node[i].distance = 100; node[i].prev = -1; } node[source].distance = 0; priority_queue<Node,vector<Node>,Compare > que; que.push(node[source]); while (!que.empty()) { Node cur = que.top(); que.pop(); for (int i = 0; i < node_num; i++) { if (matrix[cur.index][i] >= 0 && matrix[cur.index][i] + cur.distance < node[i].distance) { node[i].distance = matrix[cur.index][i] + cur.distance; node[i].prev = cur.index; que.push(node[i]); } } } for (int i = 0; i < node_num; i++) { printf("distance from %d to %d is %d\n", source, i, node[i].distance); } PrintPath(node,source,dest); return node[dest].distance;}int main(){ int num_node, num_vert; int binary_vertex; FILE* fp = fopen("input.txt", "r"); char buf[1024]; if (fscanf(fp, "%d %d %d\n", &num_node, &num_vert, &binary_vertex) != 3) { fprintf(stderr, "\nfscanf error: %s: %d\n", strerror(errno), errno); exit(1); } int** matrix = new int*[num_node]; for (int i = 0; i < num_node; i++) { matrix[i] = new int[num_node]; } for (int i = 0; i < num_node; i++) { for (int j = 0; j < num_node; j++) { matrix[i][j] = -1; } } while (fgets(buf, 1024, fp) != NULL) { int begin, end; int weight; if (sscanf(buf, "%d %d %d\n", &begin, &end,&weight) != 3) { fprintf(stderr, "\nsscanf error: %s: %d\n", strerror(errno), errno); exit(1); } if (binary_vertex == 1) { matrix[end][begin] = weight; } matrix[begin][end] = weight; } for (int i = 0; i < num_node; i++) { for (int j = 0; j < num_node; j++) { printf("%8d", matrix[i][j]); } printf("\n"); } int source = 0; int dest = 2; int dis = Dijkstra(matrix, num_node, source, dest); return 0;}
阅读全文
0 0
- 单源最短路径算法(Dijkstra算法)
- 单源最短路径算法(BellmanFord算法)
- Dijstra算法 单源最短路径算法
- 贪婪算法---单源最短路径
- 单源最短路径算法
- 单源最短路径 dijkstra算法
- 单源最短路径Dijkstra算法
- Dijkstra 单源最短路径算法
- 单源最短路径 :Dijkstra 算法
- (贪心算法)单源最短路径
- 单源最短路径 Dijkastra算法
- 单源最短路径(Dijkstra算法)
- 图算法---单源最短路径
- 单源最短路径----------Dijkstra算法
- 单源最短路径Dijkstra算法
- 单源最短路径(Dijkstra算法)
- 单源最短路径 : Dijkstra 算法
- Dijkstra单源最短路径算法
- BZOJ 1854-游戏(并查集)
- 进度条动画(纯css)
- TCP协议
- myeclipse打开.html文件乱码问题
- Vessels
- 单源最短路径算法
- 【数据库】事务实现的机制,checkpoint
- CF822C Hacker, pack your bags! 【思维好题】
- URG和PSH
- 【洛谷2986】【USACO10MAR】伟大的奶牛聚集
- python中常见的几种错误
- pytthon-异常处理与调试
- Linux命令学习之五
- Android Wi-Fi 查看信道命令