hdu2063二分匹配基础
第一道二分匹配,这题自己的理解就是在两组人中,先枚举一组人,找到与其匹配的人,若该人未被匹配->标记匹配,否者递归找(与该人匹配的同一组人是否还有其他可匹配的关系)。不知道是不是这样,先做一些简单题吧!
这题不知道男生人数的输入有什么作用- -。而且开始的时候犯了个非常二的错误,把男生与女生输入顺序输错了!囧!!唉,弱菜无地自容啊。。
代码:
#include<iostream> #include<cstring> using namespace std; struct g{ int num; int boy[555]; }gr[555]; bool flag[555]; int pre[555]; int n,m; int DFS(int x) { for(int i=0;i<gr[x].num;i++) //男生 { if(!flag[gr[x].boy[i]]) //未被匹配 { flag[gr[x].boy[i]]=true; if(pre[gr[x].boy[i]]==-1||DFS(pre[gr[x].boy[i]])) { pre[gr[x].boy[i]]=x; //第几个女生 return 1; } } } return 0; } int main() { int sum,k,a,b; while(cin>>k&&k!=0) { sum=0; cin>>m>>n; for(int i=0;i<=m;i++) gr[i].num=0; for(int i=0;i<k;i++) { cin>>a>>b; gr[a].boy[gr[a].num++]=b; } memset(pre,-1,sizeof(pre)); for(int i=1;i<=m;i++) //女生 { memset(flag,0,sizeof(flag)); sum+=DFS(i); } cout<<sum<<endl; } return 0; }