以oj 2134题 图结构练习——最短路径为例 #include <iostream> #define INF 0x3f3f3f3f using namespace std; int dist[200], gra[200][200], vis[200]; int n; void Dijkstra(int begins) { int i, j, k; ///初始化dist数组(记录每个顶点到源点最短路径的估计值),vis数组(记录每个顶点是否已经找到最短路径) for(i = 1; i <= n; i++) { dist[i] = gra[begins][i]; vis[i] = 0; } vis[begins] = 1; //源点的最短路径已经找到; dist[begins] = 0; //源点到本身的最短路径为0; for(i = 0; i < n - 1; i++) //寻找n-1次,将除了源点外的所有顶点最短路径找到(保证图是连通的) { ///每次找到与源点距离(即dist数组中的数值)估计值最小的点 int mins = INT_MAX; for(j = 1; j <= n; j++) //顶点从1号到n号 { if(mins > dist[j] && !vis[j]) { mins = dist[j]; k = j; } } vis[k] = 1; //该点的最短路径已经确定 //对与该点相连的顶点进行松弛操作 for(j = 1; j <= n; j++) //顶点从1号到n号 { if(dist[j] > dist[k] + gra[k][j] && !vis[j]) //如果源点到j的距离大于源点到k的距离加上k点到j点的距离,就更新dist【j】 { dist[j] = dist[k] + gra[k][j]; } } } } int main() { int m, a, b, c; while(cin >> n >> m) { ///初始化图的存储结构 for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) { if(i == j) gra[i][j] = 0; //自己到自己的距离为零 else gra[i][j] = INF; //其他点初始化为无穷大 } } for(int i = 0; i < m; i++) { cin >> a >> b >> c; if(gra[a][b] > c) gra[b][a] = gra[a][b] = c; } Dijkstra(1); cout << dist[n] << endl; } return 0; }
Dijkstra 算法求最短路径
猜你喜欢
转载自blog.csdn.net/aqa2037299560/article/details/80369434
今日推荐
周排行