dfs找负环(或者spfa)
#include<cstdio> #include<cstring> using namespace std; const int N=150,M=1500; struct pp { int v,nxt,d; } e[M<<1]; int T,tot,n,m,head[N],vis[N],dis[N],flag; void add(int u,int v,int d) { e[++tot].nxt=head[u];head[u]=tot;e[tot].v=v;e[tot].d=d; } bool dfs(int u) { vis[u]=1; for(int j=head[u];j;j=e[j].nxt) { int v=e[j].v,d=e[j].d; if(dis[v]>dis[u]+d) { dis[v]=dis[u]+d; if(vis[v]) { flag=1; break;} dfs(v); } } vis[u]=0; return 0; } int main() { scanf("%d",&T); while(T--) { memset(head,0,sizeof(head));tot=0; memset(dis,0,sizeof(dis)); memset(vis,0,sizeof(vis)); scanf("%d%d",&n,&m); for(int i=1,u,v,d;i<=m;i++) { scanf("%d%d%d",&u,&v,&d); add(u,v+1,d),add(v+1,u,-d); } flag=0; for(int i=1;i<=n+1&&!flag;i++) dfs(i); if(flag) puts("false"); else puts("true"); } return 0; }

京公网安备 11010502036488号