迪杰斯特拉(dijkstra)
作者:互联网
邻接矩阵写法:
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int inf=0x3f3f3f3f; 4 const int maxn=1e5+10; 5 int vis[maxn],dist[maxn]; 6 int n,m,a,b; 7 struct node 8 { 9 int dis,to; 10 bool operator<(const node x) const 11 { 12 return dis>x.dis; 13 } 14 }; 15 vector<node> w[maxn]; 16 void dijkstra() 17 { 18 memset(vis,0,sizeof(vis)); 19 memset(dist,inf,sizeof(dist)); 20 dist[0]=0; 21 vis[0]=1; 22 for(int i=0;i<w[0].size();i++) 23 { 24 int to=w[0][i].to; 25 dist[to]=w[0][i].dis; 26 } 27 int minx; 28 for(int i=0;i<n;i++) 29 { 30 minx=n; 31 for(int j=0;j<n;j++) 32 { 33 if(!vis[j]&&dist[j]<dist[minx]) 34 { 35 minx=j; 36 } 37 } 38 vis[minx]=1; 39 for(int k=0;k<w[minx].size();k++) 40 { 41 int to=w[minx][k].to; 42 if(!vis[to]&&dist[to]>dist[minx]+w[minx][k].dis) 43 { 44 dist[to]=dist[minx]+w[minx][k].dis; 45 } 46 } 47 } 48 } 49 int main() 50 { 51 cin>>n>>m; 52 node now; 53 for(int i=0;i<m;i++) 54 { 55 cin>>a>>b>>now.dis; 56 now.to=b; 57 w[a].push_back(now); 58 now.to=a; 59 w[b].push_back(now); 60 } 61 dijkstra(); 62 for(int i=0;i<n;i++) 63 { 64 printf("%d%c",dist[i],i==n-1?'\n':' '); 65 } 66 return 0; 67 }
邻接表写法(未优化):
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int inf=0x3f3f3f3f; 4 const int maxn=200050; 5 int head[maxn],dis[maxn],book[maxn]; 6 int n,m,u,v,w,s,num=0; 7 struct node 8 { 9 int to,next,dis; 10 bool operator<(const node x) const 11 { 12 return dis>x.dis; 13 } 14 }; 15 node edge[maxn]; 16 void ljb(int form,int to,int w) 17 { 18 num++; 19 edge[num].next=head[form]; 20 edge[num].dis=w; 21 edge[num].to=to; 22 head[form]=num; 23 } 24 void dijkstra() 25 { 26 fill(dis,dis+5000,inf); 27 int tmp=s; 28 dis[s]=0; 29 while(!book[tmp]) 30 { 31 book[tmp]=1; 32 for(int i=head[tmp];i!=-1;i=edge[i].next) 33 { 34 if(!book[edge[i].to]&&dis[edge[i].to]>dis[tmp]+edge[i].dis) 35 { 36 dis[edge[i].to]=dis[tmp]+edge[i].dis; 37 } 38 } 39 int minn=inf; 40 for(int i=1;i<=n;i++) 41 { 42 if(!book[i]&&dis[i]<minn) 43 { 44 minn=dis[i]; 45 tmp=i; 46 } 47 } 48 } 49 } 50 int main() 51 { 52 fill(head,head+5000,-1); 53 cin>>n>>m>>s; 54 for(int i=0;i<m;i++) 55 { 56 cin>>u>>v>>w; 57 ljb(u,v,w); 58 } 59 dijkstra(); 60 for(int i=1;i<=n;i++) 61 { 62 if(i<n) 63 cout<<dis[i]<<" "; 64 else 65 cout<<dis[i]; 66 } 67 return 0; 68 }
邻接表,优先队列堆优化:
例题:
P3371 【模板】单源最短路径(弱化版) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
#include<bits/stdc++.h> using namespace std; const int inf=1e31-1; const int maxn=1000001; int head[maxn],dis[maxn],vis[maxn]; int m,n,s,u,v,w,num=0; priority_queue< pair<int,int> > q;//第一维是dis的相反数,把大堆转化为小堆 struct node { int to,dis,next; }; node edge[maxn]; void add(int form,int to,int w) { num++; edge[num].next=head[form]; edge[num].dis=w; edge[num].to=to; head[form]=num; } void dijkstra() { fill(dis,dis+500005,inf); dis[s]=0; q.push(make_pair(0,s)); while(!q.empty()) { int x=q.top().second; q.pop(); if(vis[x]) continue; vis[x]=1; for(int i=head[x];i!=0;i=edge[i].next) { int to=edge[i].to; if(!vis[to]&&dis[to]>dis[x]+edge[i].dis) { dis[to]=dis[x]+edge[i].dis; q.push(make_pair(-dis[to],to)); } } } } int main() { cin>>n>>m>>s; for(int i=0;i<m;i++) { cin>>u>>v>>w; add(u,v,w); //add(v,u,w);无向图 } dijkstra(); for(int i=1;i<=n;i++) { if(i<n) cout<<dis[i]<<" "; else cout<<dis[i]; } return 0; }
标签:num,int,迪杰,vis,dijkstra,edge,maxn,斯特拉,dis 来源: https://www.cnblogs.com/inawaken/p/16213141.html