题解——洛谷P2294 [HNOI2005]狡猾的商人(差分约束)

裸的差分约束

dfs判断负环,如果有负环就false,否则就是true

注意有多组数据,数组要清空

#include 
#include 
#include 
#include 
#include 
using namespace std;
const int MAXN = 111;
const int MAXM = 2101;
int cnt=0,u[MAXM],v[MAXM],w[MAXM],first[MAXN],next[MAXM];
int vis[MAXN];
int inq[MAXN],dis[MAXN],f[MAXN];
int n,m;
void addedge(int ux,int vx,int wx){
    ++cnt;
    u[cnt]=ux;
    v[cnt]=vx;
    w[cnt]=wx;
    next[cnt]=first[ux];
    first[ux]=cnt;
}
bool flag=false;
void spfa(int ux){
    vis[ux]=1;
    for(int i=first[ux];i;i=next[i]){
        if(dis[ux]+w[i]<dis[v[i]]){
            if(vis[v[i]]){
                flag=true;
                return;    
            }
            dis[v[i]]=dis[ux]+w[i];
            spfa(v[i]);
        }
    }
    vis[ux]=0;
    return;
}
/*bool spfa(int s,int t){
    queue q;
    q.push(s);
    dis[s]=0;
    inq[s]=1;
    vis[s]=1;
    f[s]=1;
    while(!q.empty()){
        int u=q.front();
        q.pop();
        vis[u]=0;
        f[u]=1;
        for(int i=first[u];i;i=next[i]){
            if(w[i]+dis[u]=n)
                        return false;
                }
            }
        }
    }
    return true;
}*/
int main(){
    int T,sx,tx,vx;
    cin>>T;
    for(int pp=1;pp<=T;pp++){
    flag=false;
    cin>>n>>m;
    cnt=0;
    memset(dis,0x3f,sizeof(dis));
    memset(first,0,sizeof(first));
    memset(vis,0,sizeof(vis));
    memset(f,0,sizeof(f));
    for(int i=1;i<=m;i++){
        cin>>sx>>tx>>vx;
        addedge(sx-1,tx,vx);
        addedge(tx,sx-1,-vx);
    }
    for(int i=1;i<=n;i++){
        if(!f[i]){
            dis[i]=0;
            spfa(i);
            if(flag){
                printf("false\n");
                break;
            }
        }
    }
    if(!flag){
    printf("true\n");
    }
}
    return 0;
}

 

转载于:https://www.cnblogs.com/dreagonm/p/9433434.html

你可能感兴趣的:(ux)