题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1715
题意:多组数据,判断混合图中是否有负环...
dfs 的 spfa 快到飞起啊 orz... 若从一个点出发还能更新回来它本身,则有负环
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
#include <cmath> #include <queue> #include <cstdio> #include <iomanip> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> #define N 510 #define M 6000 #define ll long long using namespace std; inline int read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } int F; bool flag; struct zgz { int next,to,val; }edge[M]; int cnt=1,head[N]; void add(int from,int to,int val) { edge[cnt].to=to; edge[cnt].val=val; edge[cnt].next=head[from]; head[from]=cnt++; } int dis[N];bool vis[N]; void spfa(int x) { vis[x]=1; for(int i=head[x];i;i=edge[i].next) { int to=edge[i].to,val=edge[i].val; if(dis[to]>dis[x]+val) { if(vis[to]){flag=1;return ;} dis[to]=dis[x]+val; spfa(to); } } vis[x]=0; } int n,m,w,s,e,t; int main() { F=read(); while(F--) { n=read(),m=read(),w=read(); memset(head,0,sizeof(head)); cnt=1; for(int i=1;i<=m;i++) { s=read(),e=read(),t=read(); add(s,e,t);add(e,s,t); } for(int i=1;i<=w;i++) { s=read(),e=read(),t=read(); add(s,e,-t); } memset(dis,0x3f,sizeof(dis)); memset(vis,0,sizeof(vis));flag=0; for(int i=1;i<=n;i++) { spfa(i); if(flag)break; } if(flag)puts("YES"); else puts("NO"); } } |
Comments | NOTHING