HDU 2063 过山车 (最大匹配,男女配对,二分图)

 

题意:中文题目

思路:匈牙利算法解决二分图最大匹配问题。

 

 1 #include <bits/stdc++.h>

 2 using namespace std;

 3 const int N=505;

 4 int mapp[N][N]; //矩阵

 5 int girl[N];    //记录该女已分配的男编号

 6 int vis[N];     //标记是否已经尝试为其另分配

 7 int n, a, b, k, m;

 8 

 9 int find(int x)

10 {

11     for(int i=1; i<=m; i++) //扫描所有妹子

12     {

13         if(mapp[x][i]&&!vis[i])  //有暧昧,未尝试为其另分配

14         {

15             vis[i]=1;   //已尝试

16             if( !girl[i] || find(girl[i]) )

17             {

18                 girl[i]=x;

19                 return true;

20             }

21         }

22     }

23     return false;

24 }

25 

26 int hungary()

27 {

28     int cnt=0;

29     for(int i=1; i<=n; i++)

30     {

31         memset(vis,0,sizeof(vis));

32         if(find(i))    cnt++;

33     }

34     return cnt;

35 }

36 

37 int main()

38 {

39     freopen("input.txt", "r", stdin);

40 

41     while(scanf("%d",&k), k)

42     {

43         memset(vis,0,sizeof(vis));

44         memset(mapp,0,sizeof(mapp));

45         memset(girl,0,sizeof(girl));

46         scanf("%d%d",&m,&n);

47 

48         for(int i=0; i<k; i++)  //2分图

49         {

50             scanf("%d%d",&b,&a);

51             mapp[a][b]=1;

52         }

53         printf("%d\n",hungary());

54     }

55     return 0;

56 }
AC代码

 

你可能感兴趣的:(HDU)