存在负环,说明经过n-1次的松弛之后,还可以继续松弛。
BF算法
#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> using namespace std; #define inf 99999999 const int maxn=2*2000; int u[maxn],v[maxn],w[maxn]; int d[maxn]; int n,m; int BF(int p) { for(int i=0;i<n;i++) d[i]=inf; d[p]=0; for(int i=1;i<n;i++) { for(int j=0;j<m;j++) { int x=u[j],y=v[j]; if(d[x]+w[j]<d[y]) d[y]=d[x]+w[j]; } } for(int i=0;i<m;i++) { int x=u[i],y=v[i]; if(d[x]+w[i]<d[y]) return 1; } return 0; } int main() { int t; scanf("%d",&t); while(t--) { scanf("%d %d",&n,&m); for(int i=0;i<m;i++) scanf("%d %d %d",&u[i],&v[i],&w[i]); if(BF(0)) { printf("possible "); } else printf("not possible "); } return 0; }
dfs算法
#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> const int maxn=2*2000; #define inf 999999999 struct node { int u; int w; int next; }V[maxn]; int tol; int d[maxn],f[maxn]; int head[maxn]; void init() { tol=0; memset(head,-1,sizeof(head)); } void add(int u,int v,int w) { V[tol].u=v; V[tol].w=w; V[tol].next=head[u]; head[u]=tol++; } int dfs_(int u) { f[u]=1; for(int i=head[u];i!=-1;i=V[i].next) { int v=V[i].u; int w=V[i].w; if(d[u]+w<d[v]) { d[v]=d[u]+w; if(!f[v]) { if(dfs_(v)) return 1; } else return 1; } } f[u]=0; return 0; } int main() { int t,n,m; scanf("%d",&t); while(t--) { scanf("%d %d",&n,&m); for(int i=0;i<=n;i++) d[i]=inf; init(); memset(f,0,sizeof(f)); int a,b,c; while(m--) { scanf("%d %d %d",&a,&b,&c); add(a,b,c); } d[0]=0; if(dfs_(0)) { printf("possible "); } else printf("not possible "); } return 0; }