SDUTOJ 2021級ACM班&2022年寒假集訓《資料結構》專題10--最短路
阿新 • • 發佈:2022-05-08
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(intu,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 }