标签:inf ade 有向环 步骤 直接 long fine party nbsp
Dijkstra
void dj(){ for(int i=1;i<=m;i++) if(i!=k)dis[i]=M; for(int i=1;i<=m;i++){ int min=M; for(int j=1;j<=m;j++) if(b[j]==0&&dis[j]<min){ min=dis[j]; t=j; } b[t]=1; if(t==s)return; for(int j=1;j<=m;j++) if(b[j]==0&&a[t][j]>0&&dis[j]>dis[t]+a[t][j]){ dis[j]=dis[t]+a[t][j]; } } }
Floyd
for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(i!=j) s[i][j]=M; } } for(int i=1;i<=n;i++){ cin>>x; for(int j=1;j<=x;j++){ cin>>y; if(j==1) s[i][y]=0; else s[i][y]=1; } } for(int k=1;k<=n;k++){ for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(s[i][j]>s[i][k]+s[k][j]){ s[i][j]=s[i][k]+s[k][j]; } } } }
#10072. 「一本通 3.2 例 1」Sightseeing Trip:https://loj.ac/problem/10072
#include <bits/stdc++.h> #define ll long long #define inf 0x3f3f3f3f using namespace std; ll n,m,dist[200][200],mp[200][200],huan[200][200],x,y,z,len=inf; vector<ll>path; void get(ll x,ll y){ if(huan[x][y]==0)return; get(x,huan[x][y]); path.push_back(huan[x][y]); get(huan[x][y],y); } int main() { cin>>n>>m; memset(dist,inf,sizeof(dist)); for(ll i=1;i<=n;i++)dist[i][i]=0; for(ll i=1;i<=m;i++){ cin>>x>>y>>z; dist[x][y]=dist[y][x]=min(dist[x][y],z); } memcpy(mp,dist,sizeof(dist)); for(ll k=1;k<=n;k++){ for(ll i=1;i<k;i++){ for(ll j=i+1;j<k;j++){ if(len>dist[i][j]+mp[i][k]+mp[k][j]){ len=dist[i][j]+mp[i][k]+mp[k][j]; path.clear(); path.push_back(i); get(i,j); path.push_back(j); path.push_back(k); } } } for(ll i=1;i<=n;i++){ for(ll j=1;j<=n;j++){ if(dist[i][j]>dist[i][k]+dist[k][j]){ dist[i][j]=dist[i][k]+dist[k][j]; huan[i][j]=huan[j][i]=k; } } } } //先更新最小环再更新最短路:否则dist[i][j]会改变 //无向图对称性:j从i+1开始 //i、j<k:https://www.cnblogs.com/zzqc/p/6855913.html if(len==inf)cout<<"No solution."; else{ for(ll i=0;i<path.size();i++) { cout<<path[i]<<" "; } } return 0; }
5.附有向环:https://vijos.org/p/1423; 代码(直接跑floyd):
#include<bits/stdc++.h> using namespace std; #define ll long long #define inf 0x3f3f3f3f int n,m,e[210][210],w[210]; int main(){ cin>>n>>m; memset(e,inf,sizeof(e)); for(ll i=1;i<=n;i++)cin>>w[i]; for(ll i=1;i<=m;i++){ int x,y,z; cin>>x>>y>>z; e[x][y]=min(e[x][y],z+w[x]); } for(ll k=1;k<=n;k++){ for(ll i=1;i<=n;i++){ for(ll j=1;j<=n;j++){ e[i][j]=min(e[i][j],e[i][k]+e[k][j]); } } } if(e[1][1]==inf)cout<<"-1"; else cout<<e[1][1]; return 0; }
标签:inf ade 有向环 步骤 直接 long fine party nbsp
原文地址:https://www.cnblogs.com/songjian-jiansong/p/10306027.html