hdu2063 过山车

来源:互联网 发布:win7装mac os双系统 编辑:程序博客网 时间:2024/05/14 22:56
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2063
1
#include<iostream> 2 #include<math.h> 3 #include<stdio.h> 4 #include<string.h> 5 #include<stdlib.h> 6 using namespace std; 7 const int N=510; 8 int match[N]; 9 int a[N][N];10 int use[N];11 int n;12 int girl,boy;13 int dfs(int u)14 {15 int t,x;16 for(int i=1;i<=boy;i++)17 {18 x=a[u][i];//判断是否女孩喜欢这个男孩坐旁边19 if(x==1 && !use[i])20 {21 use[i]=1;//判断是否已匹配,无匹配赋值122 t=match[i];//用t标记男孩的匹配,用于后面的判断23 match[i]=u;//强制将男孩的匹配更改到当前女孩的身上24 if(t==-1 || dfs(t))//由于可能强制更改了男孩的匹配,那么男孩原来匹配的女孩25 return 1; //也是需要在另找一个她愿意的男孩进行匹配(dfs)26 match[i]=t;//如果找不到的话,那么当前的女孩是不能夺走男孩的27 }28 }29 return 0;30 }31 int bipartite()32 {33 int res=0;34 memset(match,-1,sizeof(match));//上来初始化男孩的匹配都是-135 for(int i=1;i<=girl;i++)36 {37 memset(use,0,sizeof(use));//针对每个女孩,男孩是否和他们匹配了38 if(dfs(i))39 res++;40 }41 return res;42 }43 44 int main()45 {46 //freopen("in.txt","r",stdin);47 int p,q;48 while(~scanf("%d",&n))49 {50 if(!n)51 break;52 scanf("%d%d",&girl,&boy);//女孩和男孩的数量53 memset(a,0,sizeof(a));54 for(int i=0;i<n;i++)55 {56 scanf("%d%d",&p,&q);57 a[p][q]=1;//标记上女孩的喜好58 }59 int t=bipartite();60 printf("%d\n",t);61 }62 return 0;63 }

 

原创粉丝点击