[BZOJ4500]矩阵

相当于是V[x]+V[y]=c(x是行,y是列,c是这个点的点权)

然后我们就可以用二分图判定一下是否可行。找个有点权的点随便dfs一下就行了。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N=2005;
int n,m,k,lst,dis[N];
bool vis[N];
struct Edge{
    int to[N],nxt[N],val[N],ecnt,head[N];
    void init(){
        memset(head,0,sizeof head);
        ecnt=0;
        memset(vis,0,sizeof vis);
    }
    void add(int bg,int ed,int v) {
        nxt[++ecnt]=head[bg];
        to[ecnt]=ed;
        val[ecnt]=v;
        head[bg]=ecnt;
    }
    void ins() {
        int x,y,c;
        scanf("%d%d%d",&x,&y,&c);
        add(x,y+n,c);
        add(y+n,x,c);
        lst=x;
    }
}e;
bool dfs(int x){ 
    vis[x]=1;
    for(int i=e.head[x];i;i=e.nxt[i]) {
        int v=e.to[i];
        if(!vis[v]) {
            dis[v]=e.val[i]-dis[x];
            if(!dfs(v)) return 0;
        }    
        else {
            if(dis[v]!=e.val[i]-dis[x]) return 0;
        }
    }
    return 1;
}
void solve() {
    e.init();
    scanf("%d%d%d",&n,&m,&k);
    for(int i=1;i<=k;i++) e.ins();
    dis[lst]=0;
    if(dfs(lst)) puts("Yes");else puts("No");
}
int main() {
    int T;
    scanf("%d",&T);
    while(T--) solve();
}
矩阵

 

posted @ 2018-10-03 20:13  SWHsz  阅读(177)  评论(0编辑  收藏  举报