3259 (floyd判負環||spfa判負環||bellman_ford判負環)
阿新 • • 發佈:2018-12-12
題解:第一種使用floyd判負環,只需要在演算法過程多一個判讀dp[i][i]是否為負數即可。
附上程式碼:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn=505; int min(int a,int b) { if(a>b){ return b; }else{ return a; } } int n,m,k; int mapp[maxn][maxn]; int floyd() { int f=0; for(int k=1;k<=n;k++){ for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ int t=mapp[i][k]+mapp[k][j]; if(t<mapp[i][j]){ mapp[i][j]=t; } //mapp[i][j]=min(mapp[i][j],mapp[i][k]+mapp[k][j]); } if(mapp[i][i]<0){ return 1; } } } return f; } int main() { int t; scanf("%d",&t); while(t--){ scanf("%d%d%d",&n,&m,&k); memset(mapp,0x3f3f3f3f,sizeof(mapp)); for(int i=1;i<=n;i++){ mapp[i][i]=0; } int a,b,c; for(int i=1;i<=m;i++){ scanf("%d%d%d",&a,&b,&c); if(c<mapp[a][b]){ mapp[a][b]=mapp[b][a]=c; } } for(int i=1;i<=k;i++){ scanf("%d%d%d",&a,&b,&c); mapp[a][b]=-c; } int f=floyd(); if(!f){ printf("NO\n"); }else{ printf("YES\n"); } } return 0; }
第二種使用spfa判負環
附上程式碼:
#include<iostream> #include<cstdio> #include<algorithm> #include<vector> #include<cstring> #include<queue> using namespace std; const int MAXN=550; const int inf=0x3f3f3f3f; struct Edge{ int v,cost; Edge(int _v,int _cost):v(_v),cost(_cost){} }; vector<Edge>E[MAXN]; void addedge(int u,int v,int w) { E[u].push_back(Edge(v,w)); } bool vis[MAXN]; int cnt[MAXN]; int dist[MAXN]; int n,m,w; bool spfa(int start) { memset(vis,false,sizeof(vis)); for(int i=1;i<=n;i++){ dist[i]=inf; } vis[start]=true; dist[start]=0; queue<int>que; while(!que.empty()){ que.pop(); } que.push(start); memset(cnt,0,sizeof(cnt)); cnt[start]=1; while(!que.empty()){ int u=que.front(); que.pop(); vis[u]=false; for(int i=0;i<E[u].size();i++){ int v=E[u][i].v; if(dist[v]>dist[u]+E[u][i].cost){ dist[v]=dist[u]+E[u][i].cost; if(!vis[v]){ vis[v]=true; que.push(v); if(++cnt[v]>n){ return false; } } } } } return true; } int main() { int t; scanf("%d",&t); while(t--){ scanf("%d%d%d",&n,&m,&w); for(int i=1;i<=n;i++){ E[i].clear(); } int a,b,c; for(int i=1;i<=m;i++){ scanf("%d%d%d",&a,&b,&c); addedge(a,b,c); addedge(b,a,c); } for(int i=1;i<=w;i++){ scanf("%d%d%d",&a,&b,&c); addedge(a,b,-c); } if(spfa(1)){ printf("NO\n"); }else{ printf("YES\n"); } } return 0; }