标签:
题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3646
题目抽象出来就是每一行有若干个数,问是否存在一个解法从每一行中选择一个数,使得1~n这n个数都被选到,队友说这就是一个裸的匹配啊,然后就过了。
code:
#include <cstdio> #include <iostream> #include <cstring> #include <cctype> #define clr(x,y) memset(x, y, sizeof x) #include <cmath> using namespace std; const int maxn=6e2+6; const int maxm=maxn*maxn*2; int first[maxn]; struct edge{ int nxt,t,f; }e[maxm]; void addedge(int f,int t,int ind){ e[ind].nxt=first[f]; e[ind].t=t; e[ind].f=f; first[f]=ind; } int n; char maz[maxn][maxn]; bool vis[maxn]; int match[maxn]; bool dfs(int f){ vis[f]=true; for(int p=first[f];p!=-1;p=e[p].nxt){ int t=e[p].t; int mch=match[t]; if(mch==-1||(!vis[mch]&&dfs(mch))){ match[t]=f; match[f]=t; return true; } } // printf("dfs %d no\n",f); return false; } int findmatch(){ int ans=0; for(int i=0;i<n;i++){ if(match[i]==-1){ clr(vis,0); if(dfs(i))ans++; } } return ans; } void init(){ clr(first,-1); clr(match,-1); } int main(){ //freopen("input.txt","r",stdin); while(scanf("%d",&n)==1){ init(); int en=0; for(int i=0;i<n;i++)scanf("%s",maz[i]); for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ if(maz[i][j]=='U'){ addedge(i,j+n,en++); addedge(j+n,i,en++); } } } int ans=findmatch(); if(ans==n){ puts("YES"); } else { puts("NO"); } } return 0; }
标签:
原文地址:http://blog.csdn.net/u013649253/article/details/46271785