洛谷P1129 ZJOI2007矩阵游戏

来源:互联网 发布:怎么找淘宝刷手的工作 编辑:程序博客网 时间:2024/06/05 20:40

碰到这种题嘛,肯定是要先去观察,看怎样的矩阵是不符合条件的

有一个性质,无论行,列如何变化  某一行,某一列的相对位置永远不会发生改变

所以存在该矩阵的充分条件为:存在n个点,其行列都不相等

#include<cstdio>#include<iostream>#include<algorithm>#include<cstring>#define For(i,j,k) for(int i=j;i<=k;i++)using namespace std;const int N=200+5;const int M=N*N;int h[M],cnt;struct node{int next;int to;}a[M];void addvage(int x,int y){cnt++;a[cnt].next=h[x];a[cnt].to=y;h[x]=cnt;}inline int read(){char c=getchar();while(c<'0'||c>'9')c=getchar();int x=c-'0';c=getchar();while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}return x;}int n,T,ans,vis[N],w[N];int xiong_yali(int x){for(int i=h[x];i;i=a[i].next){int y=a[i].to;if(vis[y])continue;vis[y]=1;if(w[y]==-1||xiong_yali(w[y])){w[y]=x;return 1;}}return 0;}int main(){    T=read();while(T--){  ans=0;  cnt=0;  memset(h,0,sizeof(h));  memset(a,0,sizeof(a));  n=read();  For(i,1,n)For(j,1,n){int temp=read();if(temp)addvage(i,j);}For(i,1,n)w[i]=-1;    For(i,1,n){memset(vis,0,sizeof(vis));ans+=xiong_yali(i);}if(ans==n)puts("Yes");else puts("No"); }return 0;}


原创粉丝点击