ZOJ Monthly, September 2012 Matrix Transformer
把U看成象棋中的车,这样问题转化成:在棋盘上给出若干个车,问能否选出n个车,使得他们之间不会相互攻击。
设横轴为X,纵轴为Y,每个车会独占一个X,一个Y,这样问题成转化成:是否存在每个X都可以独占一个Y。
到这里,有点二分图基础的就知道是裸二分图了。

#include<stdio.h> #include<string.h> #include<vector> #include<iostream> using namespace std; const int maxn = 205; char str[maxn]; vector<int>as[maxn]; int n,cnt,vis[maxn],to[maxn]; int dfs(int x) { for(int i = 0; i < as[x].size(); ++ i){ int v = as[x][i]; if(!vis[v]){ vis[v] = 1; if(to[v]==-1||dfs(to[v])){ to[v]=x; return 1; } } }return 0; } int main() { int i,j; while(scanf("%d",&n)==1){ for(i = 0; i < n; ++ i)as[i].clear(); for(i = 0; i < n; ++ i){ scanf("%s",str); for(j = 0; j < n; ++ j) if(str[j]=='U')as[i].push_back(j);//建图 } memset(to,-1,sizeof(to)); cnt=0; for(i = 0; i < n; ++ i){ memset(vis,0,sizeof(vis)); cnt += dfs(i); } if(cnt==n)puts("YES"); else puts("NO"); } return 0; }