kuangbin专题专题四 Til the Cows Come Home POJ

题目链接: 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 }

原文地址:https://www.cnblogs.com/SSummerZzz/p/11200557.html