UPC所罗门王的宝藏(图+BFS)

#include <bits/stdc++.h>
using namespace std;

struct Node{
    int to;
    int nxt;
    int w;
};

Node M[2005];
int indx = 0;
int head[2005];
int vis[2005];
int del[2005];
queue<int> Q;

void add(int x,int y,int z){
    indx ++;
    M[indx].to = y;
    M[indx].w = z;
    M[indx].nxt = head[x];
    head[x] = indx;
}

int bfs(int s){
    while(Q.size() != 0){Q.pop();}
    Q.push(s);
    vis[s] = 1;
    while(Q.size() != 0){
        int u = Q.front();
        Q.pop();
        for(int i = head[u];i;i = M[i].nxt){
            int v = M[i].to;
            int w = M[i].w;
            if(vis[v] != 0){
                if(del[u] + del[v] != w){
                    return 0;
                }
            }
            else{
                del[v] = w - del[u];
                vis[v] = 1;
                Q.push(v);
            }
        }
    }
    return 1;
}

int main(){
    int T;
    scanf("%d",&T);
    while(T --){
        int n,m,k,x,y,z;
        memset(vis,0,sizeof(vis));
        memset(head,0,sizeof(head));
        indx = 0;
        scanf("%d%d%d",&n,&m,&k);
        for(int i = 0;i < k;i ++){
            scanf("%d%d%d",&x,&y,&z);
            add(x,y + n,z);
            add(y + n,x,z);
        }
        int flag = 1;
        for(int i = 1;i <= n + m;i ++){
            if(vis[i] == 0){
//                if(flag == 1){flag = bfs(i);}
//                else{flag = 0;}
                flag &= bfs(i);
            }

        }
        if(flag == 1){printf("Yes
");}
        else{printf("No
");}
    }
    return 0;
}
原文地址:https://www.cnblogs.com/love-fromAtoZ/p/9381040.html