bzoj1715 [Usaco2006 Dec]Wormholes 虫洞 spfa

来源:互联网 发布:办公无线键盘鼠标 知乎 编辑:程序博客网 时间:2024/05/17 17:46

裸的判断负环,直接spfa暴力判断就好,但是没注意负权边不是双向边,强行被坑正确率= =

#include<cstdio>#include<cstring>#include<algorithm>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)#define inf 0x3c3c3c3cusing namespace std;const int N=3e5+5;int n,m;typedef long long ll;int head[N],next[N],go[N];int val[N],a[N],b[N],c[N];int q[N];int dis[N];int t,ans,tot,m2,m1;inline void add(int x,int y,int z){    go[++tot]=y;    next[tot]=head[x];    val[tot]=z;    head[x]=tot;}bool vis[N],flag=0;int cnt[N];inline void spfa(int s){    memset(dis,0x3c,sizeof(dis));    memset(cnt,0,sizeof(cnt));    memset(vis,0,sizeof(vis));    dis[s]=0;    q[1]=s;    flag=0;    int t=0,w=1;    vis[s]=1,cnt[s]=1;    while (t<w)    {        int x=q[++t];        for(int i=head[x];i;i=next[i])        {            int v=go[i];            if (dis[v]>dis[x]+val[i])            {                dis[v]=dis[x]+val[i];                if (!vis[v])                {                    if (cnt[v]==n)                    {                        flag=1;                        return ;                    }                    q[++w]=v;                    vis[v]=1;                    cnt[v]++;                }            }        }        vis[x]=0;     }}int main(){    int cas;    scanf("%d",&cas);    while (cas--)    {        memset(head,0,sizeof(head));        tot=0;        scanf("%d%d%d",&n,&m1,&m2);        fo(i,1,m1)        {            int x,y,z;            scanf("%d%d%d",&x,&y,&z);            add(x,y,z);            add(y,x,z);        }        fo(i,1,m2)        {            int x,y,z;            scanf("%d%d%d",&x,&y,&z);            add(x,y,-z);            //add(y,x,-z);        }        bool bz=0;        fo(i,1,n)        {            spfa(i);            if (flag)            {                bz=1;                printf("YES\n");                break;            }        }        if (!bz)printf("NO\n");    }}