HDU 2544 最短路 (dijkstra+堆优化)
原文链接:https://www.cnblogs.com/xwl3109377858/p/11403644.html
Problem Description
在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt。但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗?
Input
输入包括多组数据。每组数据第一行是两个整数N、M(N<=100,M<=10000),N表示成都的大街上有几个路口,标号为1的路口是商店所在地,标号为N的路口是赛场所在地,M则表示在成都有几条路。N=M=0表示输入结束。接下来M行,每行包括3个整数A,B,C(1<=A,B<=N,1<=C<=1000),表示在路口A与路口B之间有一条路,我们的工作人员需要C分钟的时间走过这条路。
输入保证至少存在1条商店到赛场的路线。
Output
对于每组输入,输出一行,表示工作人员从商店走到赛场的最短时间
Sample Input
2 1
1 2 3
3 3
1 2 5
2 3 5
3 1 2
0 0
Sample Output
3
2
1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<cmath>
5 #include<algorithm>
6 #include<map>
7 #include<set>
8 #include<vector>
9 #include<queue>
10 #include<list>
11 #include<stack>
12 //#include<unordered_map>
13 using namespace std;
14 #define ll long long
15 const int mod=1e9+7;
16 const int inf=1e9+7;
17
18 const int maxn=1e5+10;
19
20 typedef struct
21 {
22 int to;
23 int cost;
24 }St;
25
26 vector<St>edge[maxn];//vector邻接表建图
27
28 typedef pair<int,int> P;
29
30 int dis[maxn];
31
32 int n,m;
33
34 int x,y,w;
35
36 inline void dijkstra(int startt)
37 {
38 memset(dis,0x3f3f3f3f,sizeof(dis));
39
40 priority_queue<P,vector<P>,greater<P> >q;
41 q.push(make_pair(0,startt));//pair<weight,point>
42 dis[startt]=0;
43
44 while(!q.empty())
45 {
46 P now=q.top();
47 q.pop();
48
49 int v=now.second;
50
51 if(dis[v]<now.first)
52 continue;
53
54 for(int i=0;i<edge[v].size();i++)
55 {
56 St e=edge[v][i];
57
58 if(dis[e.to]>dis[v]+e.cost)
59 {
60 dis[e.to]=dis[v]+e.cost;
61 q.push(make_pair(dis[e.to],e.to));
62 }
63 }
64 }
65 }
66
67 int main()
68 {
69 ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
70
71 while(cin>>n>>m&&(n||m))
72 {
73 for(int i=1;i<=n;i++)
74 edge[i].clear();
75
76 for(int i=0;i<m;i++)
77 {
78 cin>>x>>y>>w;
79 edge[x].push_back(St{y,w});
80 edge[y].push_back(St{x,w});
81 }
82
83 dijkstra(1);
84
85 cout<<dis[n]<<endl;
86 }
87
88 return 0;
89 }
大佬见笑,,