luogu 2294 [HNOI2005]狡猾的商人 差分约束

一个差分约束模型,只需判一下有没有负环即可. 

#include <bits/stdc++.h> 
#define N 103  
#define M 2004 
#define setIO(s) freopen(s".in","r",stdin) 
using namespace std;        
int edges; 
int hd[N],to[M],nex[M],val[M],d[N],vis[N];         
void add(int u,int v,int c) 
{    
    nex[++edges]=hd[u],hd[u]=edges,to[edges]=v,val[edges]=c;       
}
int spfa(int u) 
{
    vis[u]=1;   
    for(int i=hd[u];i;i=nex[i]) 
    {
        int v=to[i]; 
        if(d[v]>d[u]+val[i]) 
        {
            if(vis[v]) return 1;      
            else 
            {
                d[v]=d[u]+val[i];    
                if(spfa(v)) return 1;  
            }
        }
    } 
    vis[u]=0; 
    return 0;   
}
void work() 
{
    memset(d,0x3f,sizeof(d));  
    int n,m,i,j; 
    scanf("%d%d",&n,&m);      
    for(i=1;i<=m;++i) 
    {
        int a,b,c; 
        scanf("%d%d%d",&a,&b,&c);    
        ++b;          
        add(a,b,c), add(b,a,-c);  
    }    
    int flag=0; 
    for(i=1;i<=n+1;++i) 
    {
        if(!vis[i]) 
        {
            d[i]=0;   
            flag=spfa(i);    
            if(flag) 
            { 
                printf("false\n");   
                break;   
            }
        }
    } 
    if(!flag) 
    {
        printf("true\n"); 
    }   
    edges=0;  
    memset(hd,0,sizeof(hd)); 
    memset(vis,0,sizeof(vis)); 
    memset(d,0,sizeof(d));    
}
int main() 
{  
    int T,i,j; 
    // setIO("input");  
    scanf("%d",&T);   
    for(i=1;i<=T;++i) work(); 
    return 0; 
}

  

posted @ 2019-09-25 19:15  EM-LGH  阅读(144)  评论(0编辑  收藏  举报