题意:一个n*n的矩阵,上面有UP和DOWN两种状态,每次可以交换任意两行或两列,问能否通过交换使得主对角线上的状态都是UP
哎!开始看错题目了,以为是博弈。。。。。还是建图最重要啊
思路:最后的状态是主对角线上都是UP,转换成每一行每一列都有UP,有点类似棋盘问题,把状态为UP
的行和列当成匹配的对象,连接边建二分图,接下来用匈牙利算法求解最大匹配数
#include<iostream>
#include<cstdio>
#include<string.h>
#include<vector>
#include<algorithm>
using namespace std;
#define N 205
int match[N],vis[N];
vector <int> map[N];
int find(int v)
{
for(int i=0; i<map[v].size(); i++)
{
int u=map[v][i];
if(!vis[u])
{
vis[u]=1;
if(match[u]==-1||find(match[u]))
{
match[u]=v;
return 1;
}
}
}
return 0;
}
int main()
{
int i,j,n,res;
char a;
while(~scanf("%d",&n))
{
res=0;
for(i=0; i<n; i++)
{
map[i].clear();
getchar();
for(j=0; j<n; j++)
{
scanf("%c",&a);
if(a=='U') map[i].push_back(j);
}
}
memset(match,-1,sizeof(match));
for(i=0; i<n; i++)
{
if(map[i].size()<=0)
{
res=0;
break;
}
memset(vis,0,sizeof(vis));
res+=find(i);
}
if(res==n) puts("YES");
else puts("NO");
}
return 0;
}