题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1874 Dijkstra算法求最短路 注意:// 各数组都从下标1开始
int dist[maxn]; // 表示当前点到源点的最短路径长度
int pre[maxn]; // 记录当前点的前一个结点
int c[maxn][maxn]; // 记录图的两点间路径长度
int n, m; // 图的结点数和路径数
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; const int inf = 100000000; const int maxn = 210; int map[maxn][maxn]; int dist[maxn]; int pre[maxn]; int vis[maxn]; int n, m; void Dijkstra(int v) { memset(vis, 0, sizeof(vis)); for(int i = 1; i <= n; i++) { dist[i] = map[v][i]; if(dist[i] == inf) pre[i] = 0; else pre[i] = v; } dist[v] = 0; vis[v] = 1; for(int i = 2; i <= n; i++) { int temp = inf; int u = v; for(int j = 1; j <= n; j++) if(!vis[j]&&dist[j]<temp) { u = j; temp = dist[j]; } //if(u == v) return ; vis[u] = 1; for(int j = 1; j <= n; j++) if(!vis[j]&&map[u][j]!=inf&&dist[j]>dist[u]+map[u][j]) { dist[j] = dist[u]+map[u][j]; pre[j] = u; } } //for(int i = 1; i <= n; i++) // cout<<dist[i]<<endl; //cout<<endl; } int main() { int p, q, len; while(cin>>n>>m) { if(!n&&!m) break; for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) { if(i == j) map[i][j] = 0; else map[i][j] = inf; } while(m--) { scanf("%d%d%d", &p, &q, &len); if(len < map[p+1][q+1]) { map[p+1][q+1] = len; map[q+1][p+1] = len; } //cout<<p<<" "<<q<<" "<<map[q+1][p+1]<<endl; } for(int i = 1; i <= n; i++) dist[i] = inf; int s, t; scanf("%d%d", &s, &t); Dijkstra(s+1); if(dist[t+1] != inf) cout<<dist[t+1]<<endl; else cout<<"-1"<<endl; } return 0; }
原文参考自www.wutianqi.com/?p=1890
HDU1874畅通工程续 (Dijkstra算法求最短路)
最新推荐文章于 2021-07-10 16:18:19 发布