题目链接: https://vjudge.net/problem/POJ-2387
题意:从编号为n的城市到编号为1的城市的最短路。
思路:dijkstra模板题,直接套板子,代码中我会带点注释给初学者看。
1 #include <iostream> 2 #include <cstring> 3 #include <algorithm> 4 #include <cstdio> 5 #include <string> 6 using namespace std; 7 8 typedef long long LL; 9 #define inf (1LL << 30) - 1 10 #define rep(i,j,k) for(int i = (j); i <= (k); i++) 11 #define rep__(i,j,k) for(int i = (j); i < (k); i++) 12 #define per(i,j,k) for(int i = (j); i >= (k); i--) 13 #define per__(i,j,k) for(int i = (j); i > (k); i--) 14 15 const int N = 1100; 16 bool vis[N]; //是否访问过 17 int mp[N][N]; 18 int dis[N]; //到不同城市的距离 19 int t,n; 20 21 void init(){ 22 memset(vis,0,sizeof(vis)); 23 rep(i,1,n) rep(j,1,n){ 24 if(i == j) mp[i][j] = 0; 25 else mp[i][j] = inf; 26 } 27 } 28 29 void input(){ 30 31 int u,v,w; 32 rep(i,1,t){ 33 cin >> u >> v >> w; 34 if(mp[u][v] > w) mp[u][v] = mp[v][u] = w; 35 } 36 37 } 38 39 void dijkstra(){ 40 41 rep(i,1,n) dis[i] = mp[n][i]; //n到其他城市的距离 42 vis[n] = true; //标记n城市任务完成 43 44 rep(i,2,n){ //接下来 n-1个城市的操作 45 46 int x = -1; 47 int c = inf; 48 49 rep(j,1,n){ 50 //该城市未被访问过 选出当前到每个点的最小值,并得到坐标 51 if(!vis[j] && c > dis[j]) x = j, c = dis[j]; 52 } 53 if(x == -1) continue; //没找到一个,即该城市无法到达其他未被访问的城市 54 55 vis[x] = true; //标记这个当前这个离起始点最短距离的城市 56 rep(p,1,n){ 57 58 //起始点到p城市的所有距离之和 大于 起始点到x点的所有距离之后 加上 x点到p点的距离 59 if(!vis[p] && dis[x] + mp[x][p] < dis[p]){ 60 dis[p] = dis[x] + mp[x][p]; 61 } 62 } 63 64 } 65 //到达点1城市的最短距离 66 cout << dis[1] << endl; 67 } 68 69 int main(){ 70 71 72 ios::sync_with_stdio(false); 73 cin.tie(0); 74 75 cin >> t >> n; 76 77 init(); //初始化 78 input(); //输入 79 dijkstra(); //最短路 80 81 getchar();getchar(); 82 83 return 0; 84 }