#include<iostream> #include<stdio.h> #include<stdlib.h> #include<algorithm> #include<vector> #include<queue> #include<string.h> #include<stdlib.h> using namespace std; #define INF 0xfffffff #define N 1010 int maps[N][N], dist[N];//distance保存表示从起点到i点的距离 maps保存图 bool visit[N];//标记这个店是否被参观过 int point, side;//点,边 void Init(); int Dij(int Star, int End); int main() { while(cin >> point >> side, point + side) { Init();//Initial int pa, pb, i, t; for(i=0; i<side; i++) { cin >>pa>>pb>>t; maps[pa][pb]=min(maps[pa][pb], t);//因为也许反向走路的长度不同 maps[pb][pa]=maps[pa][pb]; } int answer=Dij(1, point); cout << answer << endl; } return 0; } void Init() { for(int i=0; i<=point; i++) { visit[i]=false; dist[i]=INF; for(int j=0; j<=i; j++)//其实不明白这里为什么这样写,即便是我自己写的 maps[i][j]=maps[j][i]=INF;//真的很神奇,其实这就等同于for(int j=0; j<=point; j++) maps[i][j]=INF; } } int Dij(int Star, int End) { dist[Star]=0; for(int i=1; i<=point; i++) { int index, Min; index=0, Min=INF;//index 代表与i距点最近的点的下标 for(int j=1; j<=point; j++) { if(!visit[j]&&Min>dist[j]) Min=dist[j], index=j; }//代表找到了距1点最近的一个点 这是一个二维矩阵 visit[index]=true; for(int j=1; j<=point; j++) { if(!visit[j]&&dist[j]>dist[index]+maps[index][j]) dist[j]=dist[index]+maps[index][j]; } } return dist[End]; }
连接表代码 #include <iostream> #include <cstdlib> #include <cstdio> #include <algorithm> #include <vector> #include <queue> using namespace std; #define INF 0xfffffff #define maxn 1002 struct node { int e, w; }; vector<node> G[maxn]; int dist[maxn];//表示从起点到第i点的距离 bool vis[maxn];//判断这个点是否被参观过 int m, n;//边数 m 顶点数 n void Init() { memset(vis, false, sizeof(vis)); for(int i=0; i<=n; i++) { dist[i] = INF; G[i].clear(); } } int Dij(int Star,int End)//起点 --- 终点 { dist[Star] = 0; for(int i=1; i<=n; i++) { int index = 0, Min = INF; for(int j=1; j<=n; j++) { if( !vis[j] && Min > dist[j] )//找出没有被参观过,并且距离起点最近的点 Min = dist[j], index = j; } vis[index] = true; int len = G[index].size(); for(int j=0; j<len; j++)//更新所有未曾到达的点距离,使之成为最近的点 { node P; P = G[index][j]; if( !vis[P.e] && dist[P.e] > dist[index] + P.w ) { dist[P.e] = dist[index] + P.w; } } } return dist[End]; } int main() { node P; while(cin >> n >> m, m + n) { Init(); int a, b , c; for(int i=0; i<m; i++) { cin >> a >> b >> c; P.e = b, P.w = c; G[a].push_back(P); P.e = a; G[b].push_back(P); } int ans = Dij(1,n); cout << ans << endl; } return 0; }