[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(); }
我是咸鱼。转载博客请征得博主同意Orz