乐逍遥xwl

导航

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 }

 

 

 

posted on 2019-08-24 09:50  乐逍遥xwl  阅读(230)  评论(0编辑  收藏  举报