最短路.
dijkstra 算法.
代码如下:
1 #include<iostream> 2 #include<cstring> 3 #define MAX 9999999 4 5 using namespace std; 6 7 int n, m; 8 int map[202][202]; 9 int vis[202]; //标记是否更新 1为更新 10 int dir[202]; //到出发点的距离 11 12 void dij(int s) 13 { 14 int i, j; 15 int pos, min; 16 memset(vis, 0, sizeof(vis)); 17 for (i=0; i<=n; i++) //初始化各边到出发点的距离 18 dir[i]=map[s][i]; 19 vis[s]=1; //标记出发点 更新 20 for (i=1; i<n; i++) //循环n-1次 查找 21 { 22 min=MAX; 23 for (j=0; j<n; j++) 24 { 25 if (vis[j] == 0 && dir[j] < min) //每次找还未被最终更新的点中 到出发点最短的点 26 { 27 pos=j; 28 min=dir[j]; 29 } 30 } 31 vis[pos]=1; 32 for (j=0; j<n; j++) //用目前最短的点去更新其它剩余的点 33 { 34 if (vis[j] == 0 && dir[j] > dir[pos] + map[pos][j]) 35 dir[j]=dir[pos]+map[pos][j]; 36 } 37 } 38 } 39 40 int main() 41 { 42 int i, j; 43 int a, b, d, s, t; 44 while(cin >> n >> m) 45 { 46 for (i=0; i<n; i++) //初始化为最大值 47 for (j=0; j<n; j++) 48 map[i][j]=MAX; 49 for (i=0; i<n; i++) 50 map[i][i]=0; 51 for (i=0; i<m; i++) 52 { 53 cin >> a >> b >> d; 54 if (d < map[a][b]) //防止 重边 55 map[b][a]=map[a][b]=d; 56 } 57 cin >> s >> t; 58 dij(s); 59 if (dir[t] < MAX) 60 cout << dir[t] << endl; 61 else 62 cout << "-1" << endl; 63 } 64 return 0; 65 }