题目链接:
[ZOJ 3646]Matrix Transformer[二分图匹配]
题意分析:
任意交换两行或者交换两列,可以进行无限次。问:能否使主对角线全都是UP?
解题思路:
最终需要到达的状态是对角线全都是UP。那么问题可以转换为:最终需要每一行都对应着唯一一个UP,且这个UP只属于这一行所拥有。那么就是这一行对这一列,且这一列上的这一个行位置是UP。整个就是一个匹配的思想,每一行都得对应唯一的一列UP。如果存在这样的匹配,那么就是能达到目的,否则是不行。
个人感受:
嘛,反正我是没看出来,即使网上说是赤裸裸的模板,不过这之前就做过一道二分,也是看题解才知道这特么是二分。。。。图论建图实在是holy high的事情啊。
具体代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int INF = 0x7f7f7f7f, MAXN = 211;
int line[MAXN][MAXN], match[MAXN], n;
bool vis[MAXN];
bool find(int x)
{
for (int i = 0; i < n; ++i)
{
if (line[x][i] && !vis[i])
{
vis[i] = 1;
if (match[i] == -1 || find(match[i]))
{
match[i] = x;
return 1;
}
}
}
return 0;
}
int main()
{
while (cin >> n)
{
char x;
memset(line, 0, sizeof line);
memset(match, -1, sizeof match);
for (int i = 0; i < n; ++i)
for (int j = 0; j < n; ++j)
{
cin >> x;
if (x == 'U') line[i][j] = 1;
}
int ans = 0;
for (int i = 0; i < n; ++i)
{
memset(vis, 0, sizeof vis);
ans += find(i);
}
if (ans == n) cout << "YES\n";
else cout << "NO\n";
}
return 0;
}