1. 程式人生 > 其它 >SDUTOJ 2021級ACM班&2022年寒假集訓《資料結構》專題10--最短路

SDUTOJ 2021級ACM班&2022年寒假集訓《資料結構》專題10--最短路

A - 圖結構練習——最短路徑

dijkstra樸素版和堆優化版的模板,權當複習了

因為是迴圈輸入,一開始寫初始化函式的時候沒有把head和vis也初始化掉,導致TLE了。

左樸素版,右優化版

樸素版:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,m,cnt,cur;
 4 int head[210];
 5 int dis[210];
 6 bool vis[210];
 7 
 8 struct node
 9 {
10     int v,w,next;
11 } edge[100000];
12 
13 void add(int
u,int v,int w) 14 { 15 edge[++cnt].v=v; 16 edge[cnt].w=w; 17 edge[cnt].next=head[u]; 18 head[u]=cnt; 19 } 20 21 void init(int n) 22 { 23 for(int i=1; i<=n; i++) 24 { 25 dis[i]=INT_MAX; 26 head[i]=0; 27 vis[i]=0; 28 } 29 dis[1]=0; 30 cur=1;
31 cnt=0; 32 } 33 34 void dijkstra(int n) 35 { 36 for(int i=head[1]; i!=0; i=edge[i].next) 37 dis[edge[i].v]=min(dis[edge[i].v],edge[i].w); 38 while(!vis[cur]) 39 { 40 vis[cur]=true; 41 for(int i=head[cur]; i!=0; i=edge[i].next) 42 { 43 if
(!vis[edge[i].v] && dis[edge[i].v]>dis[cur]+edge[i].w) 44 dis[edge[i].v]=dis[cur]+edge[i].w; 45 } 46 int minn=INT_MAX; 47 for(int i=1; i<=n; i++) 48 { 49 if(!vis[i] && dis[i]<minn) 50 { 51 minn=dis[i]; 52 cur=i; 53 } 54 } 55 } 56 cout<<dis[n]<<endl; 57 } 58 59 int main() 60 { 61 while(cin>>n>>m) 62 { 63 init(n); 64 if(m!=0) 65 { 66 for(int i=1; i<=m; i++) 67 { 68 int u,v,w; 69 cin>>u>>v>>w; 70 add(u,v,w); 71 add(v,u,w); 72 } 73 dijkstra(n); 74 } 75 else cout<<"0"<<endl; 76 } 77 return 0; 78 }

優化版:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,m,cnt,cur;
 4 int head[20010];
 5 int dis[20010];
 6 bool vis[20010];
 7 priority_queue< pair<int,int>,vector< pair<int,int> >,greater<pair<int,int> > >q;
 8 
 9 struct node
10 {
11     int v,w,next;
12 }edge[1000010];
13 
14 void add(int u,int v,int w)
15 {
16     edge[++cnt].v=v;
17     edge[cnt].w=w;
18     edge[cnt].next=head[u];
19     head[u]=cnt;
20 }
21 
22 void init(int n)
23 {
24     for(int i=1; i<=n; i++)
25     {
26         dis[i]=INT_MAX;
27         head[i]=0;
28         vis[i]=0;
29     }
30     dis[1]=0;
31     cnt=0;
32 }
33 
34 void dijkstra(int n)
35 {
36     q.push(make_pair(0,1));
37     while(!q.empty())
38     {
39         int point=q.top().second;
40         q.pop();
41         if(vis[point]) continue;
42         vis[point]=1;
43         for(int i=head[point]; i!=0; i=edge[i].next)
44         {
45             if(dis[edge[i].v]>dis[point]+edge[i].w)
46             {
47                 dis[edge[i].v]=dis[point]+edge[i].w;
48                 q.push(make_pair(dis[edge[i].v],edge[i].v));
49             }
50         }
51     }
52     cout<<dis[n]<<endl;
53 }
54 
55 int main()
56 {
57     while(cin>>n>>m)
58     {
59         init(n);
60         for(int i=1; i<=m; i++)
61         {
62             int u,v,w;
63             cin>>u>>v>>w;
64             add(u,v,w);
65             add(v,u,w);
66         }
67         dijkstra(n);
68     }
69     return 0;
70 }