怎么说呢,其实有一点非常显然
只要有n个点,他们的横纵坐标互不相等那么显然是可行的
但是如何判断呢?引入一个叫做二分图匹配的东西
也就是每一个横坐标都要匹配一个纵坐标,这样才可以使得横纵坐标互不相等
然后我用的是匈牙利算法
下面是代码
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
int n;
int map[203][203];
int used[203],girl[203];
bool _find(int x){
for(int i=1;i<=n;i++){
if(map[x][i]&&!used[i]){
used[i]=1;
if(!girl[i]||_find(girl[i])){
girl[i]=x;
return true;
}
}
}
return false;
}
bool _is(){
memset(girl,0,sizeof(girl));
memset(used,0,sizeof(used));
for(int i=1;i<=n;i++){
memset(used,0,sizeof(used));
if(!_find(i)){
return false;
}
}
return true;
}
int main(){
int T;
cin>>T;
while(T--){
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>map[i][j];
}
}
if(_is()){
cout<<"Yes"<<endl;
}else{
cout<<"No"<<endl;
}
}
return 0;
}
/*
in:
2
2
0 0
0 1
3
0 0 1
0 1 0
1 0 0
out:
No
Yes
*/