最短路。。。(基础
最短路基础
Dijkstra算法
分析:算法思想就是每次找未标记的最小值,然后再以最小值来更新所有的节点值。
1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,m,mapp[505][505],f[100009]; 4 bool vis[505]; 5 long long dij(){ 6 memset(f,0x3f,sizeof(f)); 7 f[1]=0; 8 for(int j=1;j<=n;j++){ 9 int t=-1; 10 for(int i=1;i<=n;i++){ 11 if(vis[i]==false){ 12 if(t==-1) t=i; 13 else if(f[i]<f[t]) t=i; 14 } 15 } 16 vis[t]=true; 17 for(int i=1;i<=n;i++){ 18 f[i]=min(f[i],f[t]+mapp[t][i]); 19 } 20 } 21 if(f[n]==0x3f3f3f3f) return -1; 22 return f[n]; 23 } 24 int main(){ 25 cin>>n>>m; 26 memset(mapp,0x3f,sizeof(mapp)); 27 for(int i=1;i<=m;i++){ 28 int be,en,wei; 29 cin>>be>>en>>wei; 30 mapp[be][en]=min(mapp[be][en],wei); 31 } 32 for(int i=1;i<=n;i++){ 33 mapp[i][i]=0; 34 } 35 int t=dij(); 36 cout<<t; 37 return 0; 38 }
堆优化
思路:因为一个一个去找最小值就太慢了,我们就用了堆来处理它们,就是这样
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=1e6+10,M=2e6+10; 4 struct node{ 5 int to,next,val; 6 }edge[M]; 7 typedef pair<int,int> PII; 8 priority_queue<PII,vector<PII>,greater<PII> > q; 9 int h[N],idx=0,dist[N],n,m; 10 bool st[N]; 11 void add(int x,int y,int z){ 12 edge[idx].to=y;edge[idx].val=z; 13 edge[idx].next=h[x];h[x]=idx++; 14 } 15 void dijkstra(){ 16 memset(dist,0x3f,sizeof(dist)); 17 dist[1]=0; 18 q.push({0,1}); 19 while(!q.empty()){ 20 PII t=q.top(); 21 q.pop(); 22 int dis=t.first,u=t.second; 23 if(st[u]) continue; 24 st[u]=true; 25 for(int i=h[u];i!=-1;i=edge[i].next){ 26 int j=edge[i].to; 27 if(dist[j]>edge[i].val+dis){ 28 dist[j]=edge[i].val+dis; 29 q.push({dist[j],j}); 30 } 31 } 32 } 33 } 34 int main(){ 35 cin>>n>>m; 36 memset(h,-1,sizeof(h)); 37 for(int i=1;i<=m;i++){ 38 int u,v,w; 39 cin>>u>>v>>w; 40 add(u,v,w); 41 } 42 dijkstra(); 43 if(dist[n]>0x3f3f3f3f/2) cout<<-1; 44 else cout<<dist[n]; 45 return 0; 46 }
Floyd算法
思路:三重for循环精髓,在i.j中找一个k,让这条路径经过k,来找路径最小值
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=0x3f3f3f3f; 4 int fl[300][300]; 5 int n,m,k; 6 void f(){ 7 for(int ii=1;ii<=n;ii++){ 8 for(int i=1;i<=n;i++){ 9 for(int j=1;j<=n;j++){ 10 fl[i][j]=min(fl[i][j],fl[i][ii]+fl[ii][j]); 11 } 12 } 13 } 14 } 15 int main(){ 16 cin>>n>>m>>k; 17 int a,b,c; 18 memset(fl,N,sizeof(fl)); 19 for(int i=1;i<=m;i++){ 20 cin>>a>>b>>c; 21 fl[a][b]=min(c,fl[a][b]); 22 } 23 for(int i=1;i<=n;i++){ 24 fl[i][i]=0; 25 } 26 f(); 27 for(int i=1;i<=k;i++){ 28 cin>>a>>b; 29 if(fl[a][b]==N)cout<<"impossible"<<endl; 30 else cout<<fl[a][b]<<endl; 31 } 32 return 0; 33 }
SPFA(关于SPFA,它已经死了)
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=100009,M=200009; 4 int ver[100009],edge[M],nex[M],head[N],tot; 5 int n,m,f[N]; 6 bool vis[N]; 7 void add(int x,int y,int z){ 8 ver[++tot]=y;edge[tot]=z; 9 nex[tot]=head[x],head[x]=tot; 10 } 11 int SPFA(){ 12 memset(f,0x3f,sizeof(f)); 13 queue<int> q; 14 f[1]=0; 15 vis[1]=true; 16 q.push(1); 17 while(!q.empty()){ 18 int x=q.front(); 19 q.pop(); 20 vis[x]=false; 21 for(int i=head[x];i;i=nex[i]){ 22 int j=ver[i]; 23 if(f[j]>f[x]+edge[i]){ 24 f[j]=f[x]+edge[i]; 25 if(vis[j]==false){ 26 vis[j]=true; 27 q.push(j); 28 } 29 } 30 } 31 } 32 if(f[n]==0x3f3f3f3f) return -1; 33 return f[n]; 34 } 35 int main(){ 36 cin>>n>>m; 37 for(int i=1;i<=m;i++){ 38 int from,to,z; 39 cin>>from>>to>>z; 40 add(from,to,z); 41 } 42 int z=SPFA(); 43 if(z==-1) cout<<"impossible"; 44 else cout<<z; 45 return 0; 46 }
今天没什么时间写总结了,总之就是非常的水
版权声明:本文为001A原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。