最短路四种算法

来源:互联网 发布:安装ubuntu分区不可用 编辑:程序博客网 时间:2024/06/05 01:54

题意,赤果果的最短路

想当年傻傻地用floyd和dijkstra乱刷过,最近好好理解了一下最短路,今天用四种算法实现了一遍。

以后可以当模板用。

代码:

floyd

[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. /* 
  2. *  Author:      illuz <iilluzen[at]gmail.com> 
  3. *  Blog:        http://blog.csdn.net/hcbbt 
  4. *  File:        hdu2544.cpp 
  5. *  Create Date: 2013-11-28 15:37:26 
  6. *  Descripton:  min path, floyd 
  7. */  
  8.   
  9. #include <cstdio>  
  10. #include <cstring>  
  11.   
  12. const int MAXN = 110;  
  13. const int INF = 0x3c3c3c3c - 1;  
  14.   
  15. int nn, en; // num of node and edge  
  16. int map[MAXN][MAXN];  
  17.   
  18. int min(int a, int b) {  
  19.     return a < b ? a : b;  
  20. }  
  21.   
  22. int floyd() {  
  23.     for (int k = 1; k <= nn; k++)  
  24.         for (int i = 1; i <= nn; i++)  
  25.             for (int j = 1; j <= nn; j++)  
  26.                 map[i][j] = min(map[i][j], map[i][k] + map[k][j]);  
  27. }  
  28.   
  29. int main() {  
  30.     int s, e, t;  
  31.     while (~scanf("%d%d", &nn, &en) && (nn || en)) {  
  32.         // init  
  33.         for (int i = 1; i <= nn; i++)  
  34.             for (int j = 1; j <= nn; j++)  
  35.                 map[i][j] = INF;  
  36.         // input  
  37.         for (int i = 0; i < en; i++) {  
  38.             scanf("%d%d%d", &s, &e, &t);  
  39.             if (t < map[s][e])  
  40.                 map[s][e] = map[e][s] = t;  
  41.         }  
  42.         floyd();  
  43.         printf("%d\n", map[1][nn]);  
  44.     }  
  45.     return 0;  
  46. }  


dijkstra

[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. /* 
  2. *  Author:      illuz <iilluzen[at]gmail.com> 
  3. *  Blog:        http://blog.csdn.net/hcbbt 
  4. *  File:        hdu2544.cpp 
  5. *  Create Date: 2013-11-28 15:37:26 
  6. *  Descripton:  min path, dijkstra 
  7. */  
  8.   
  9. #include <cstdio>  
  10. #include <cstring>  
  11.   
  12. const int MAXN = 110;  
  13. const int INF = 0x3c3c3c3c - 1;  
  14.   
  15. int nn, en; // num of node and edge  
  16. int map[MAXN][MAXN], dis[MAXN];  
  17. bool vis[MAXN];  
  18.   
  19. int dijkstra(int s, int e) {  
  20.     memset(vis, 0, sizeof(vis));  
  21.     // init the dis  
  22.     for (int i = 1; i <= nn; i++)  
  23.         if (i == s) dis[i] = 0;  
  24.         else dis[i] = map[s][i];  
  25.     vis[s] = true;  
  26.     for (int i = 1; i <= nn; i++) {  
  27.         int t = INF, k;  
  28.         for (int j = 1; j <= nn; j++)  
  29.             if (!vis[j] && t > dis[j])  
  30.                 t = dis[j], k = j;  
  31.         if (t == INF) break;  
  32.         vis[k] = true;  
  33.         for (int j = 1; j <= nn; j++)  
  34.             if (!vis[j] && dis[j] > dis[k] + map[k][j])  
  35.                 dis[j] = dis[k] + map[k][j];  
  36.     }  
  37.     return dis[e];  
  38. }  
  39.   
  40. int main() {  
  41.     int s, e, t;  
  42.     while (~scanf("%d%d", &nn, &en) && (nn || en)) {  
  43.         // init  
  44.         for (int i = 1; i <= nn; i++)  
  45.             for (int j = 1; j <= nn; j++)  
  46.                 map[i][j] = INF;  
  47.         // input  
  48.         for (int i = 0; i < en; i++) {  
  49.             scanf("%d%d%d", &s, &e, &t);  
  50.             if (t < map[s][e])  
  51.                 map[s][e] = map[e][s] = t;  
  52.         }  
  53.         printf("%d\n", dijkstra(1, nn));  
  54.     }  
  55.     return 0;  
  56. }  


bellman ford

[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. /* 
  2. *  Author:      illuz <iilluzen[at]gmail.com> 
  3. *  Blog:        http://blog.csdn.net/hcbbt 
  4. *  File:        hdu2544.cpp 
  5. *  Create Date: 2013-11-28 15:37:26 
  6. *  Descripton:  min path, bellman ford  
  7. */  
  8.   
  9. #include <cstdio>  
  10. #include <cstring>  
  11. #include <algorithm>  
  12. using namespace std;  
  13.   
  14. const int MAXN = 110;  
  15. const int INF = 0x3c3c3c3c - 1;  
  16.   
  17. struct Edge {  
  18.     int u, v;  
  19.     int cost;  
  20. } e[MAXN * MAXN / 2];  
  21.   
  22. int nn, en; // num of node and edge  
  23. int dis[MAXN];  
  24.   
  25. int bellman_ford(int op, int ed) {  
  26.     for (int i = 1; i <= nn; i++)  
  27.         dis[i] = INF;  
  28.     dis[op] = 0;  
  29.     for (int i = 0; i < nn - 1; i++)  
  30.         for (int j = 0; j < en * 2; j++)  
  31.             dis[e[j].v] = min(dis[e[j].v], dis[e[j].u] + e[j].cost);  
  32.     return dis[ed];  
  33. }  
  34.   
  35. int main() {  
  36.     int op, ed, t;  
  37.     while (~scanf("%d%d", &nn, &en) && (nn || en)) {  
  38.         // input  
  39.         for (int i = 0; i < en; i++) {  
  40.             scanf("%d%d%d", &op, &ed, &t);  
  41.             e[i].u = op; e[i].v = ed; e[i].cost = t;  
  42.             e[i + en].u = ed; e[i + en].v = op; e[i + en].cost = t;  
  43.         }  
  44.         printf("%d\n", bellman_ford(1, nn));  
  45.     }  
  46.     return 0;  
  47. }  


spfa+queue

[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. /* 
  2. *  Author:      illuz <iilluzen[at]gmail.com> 
  3. *  Blog:        http://blog.csdn.net/hcbbt 
  4. *  File:        hdu2544.cpp 
  5. *  Create Date: 2013-11-28 15:37:26 
  6. *  Descripton:  min path, spfa 
  7. */  
  8.   
  9. #include <cstdio>  
  10. #include <cstring>  
  11. #include <algorithm>  
  12. #include <queue>  
  13. #include <iostream>  
  14. using namespace std;  
  15.   
  16. const int MAXN = 110;  
  17. const int INF = 0x3c3c3c3c - 1;  
  18.   
  19. int nn, en; // num of node and edge  
  20. int map[MAXN][MAXN], dis[MAXN];  
  21. bool vis[MAXN]; // if in the queue  
  22.   
  23. int spfa(int op, int ed) {  
  24.     queue<int> q;  
  25.     memset(vis, falsesizeof(vis));  
  26.   
  27.     for (int i = 1; i <= nn; i++)  
  28.         dis[i] = INF;  
  29.     dis[op] = 0;  
  30.   
  31.     q.push(op);  
  32.     vis[op] = true;  
  33.   
  34.     while (!q.empty()) {  
  35.         int cur = q.front();  
  36.         q.pop();  
  37.         vis[cur] = false;  
  38.         for (int i = 1; i <= nn; i++)  
  39.             if (dis[i] > dis[cur] + map[cur][i]) {  
  40.                 dis[i] = dis[cur] + map[cur][i];  
  41.                 if (!vis[i]) {  
  42.                     q.push(i);  
  43.                     vis[i] = true;  
  44.                 }  
  45.             }  
  46.     }  
  47.     return dis[ed];  
  48. }  
  49.   
  50. int main() {  
  51.     int op, ed, t;  
  52.     while (~scanf("%d%d", &nn, &en) && (nn || en)) {  
  53.         // init  
  54.         for (int i = 1; i <= nn; i++)  
  55.             for (int j = 1; j <= nn; j++)  
  56.                 map[i][j] = INF;  
  57.         // input  
  58.         for (int i = 0; i < en; i++) {  
  59.             scanf("%d%d%d", &op, &ed, &t);  
  60.             if (t < map[op][ed])  
  61.                 map[op][ed] = map[ed][op] = t;  
  62.         }  
  63.         printf("%d\n", spfa(1, nn));  
  64.     }  
  65.     return 0;  
  66. }  

转载于:http://blog.csdn.net/hcbbt/article/details/17008877


0 0
原创粉丝点击