XDUProblem 1078 - 地震和海啸

http://acm.xidian.edu.cn/land/problem/detail?problem_id=1078

Problem 1078 - 地震和海啸

Time Limit: 1000MS      Memory Limit: 65536KB      Difficulty:    
Total Submit: 165     Accepted: 66     Special Judge: No 
Description

2012来临之际,世界正在遭受着各种灾难。

深远领主 丁丁二世也在这时候显露了他邪恶的本性。 丁丁拥有制造地震和海啸的能力。

这一次,丁丁决定用最多的“超级组合”来破坏ACM实验室的稳定与和平。

丁丁能制造  n 个地震, m 个海啸。

每个地震对于海啸都有着特殊的喜好,只有地震  和其 喜好的海啸联手,才能成为一个超级组合。

请聪明的ACMer你算出每次丁丁最多能派遣多少个“超级组合”,好让我们共同抵御丁丁的“超级组合”!

Input
第 1 行有 2 个正整数 m 和 n。 n是海啸(n<100);m是地震 (m <100)。地震编号为 1~m;海啸的编号为 m+1~n。
接下来每行有 2 个正整数 i 和 j,表示地震 i 喜好和海啸 j 配合。以 2个-1 结束输入。
Output
请输出"超级组合"的最多数量.输出时请带上换行符。
Sample Input
5 10
1 7
1 8
2 6
2 9
2 10
3 7
3 8
4 7
4 8
5 10
-1 -1
Sample Output
4
/************************************************************
* problem:地震与海啸
* algorithm:二分图求最大匹配
* author: crazy_石头
* date:2013/09/11
**************************************************************/
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int maxn=100+5;
int map[maxn][maxn],Linker[maxn];
bool used[maxn];

int n,m;

inline int max(int a,int b)
{
    return a>b?a:b;
}

inline int DFS(int u)
{
     for(int v=m+1;v<=n;v++)
     {
         if(map[u][v]&&!used[v])
         {
             used[v]=true;
             if(Linker[v]==-1||DFS(Linker[v]))
             {
                 Linker[v]=u;
                return 1;
             }
         }
     }
     return 0;
}

inline int Hungary()
{
     int res=0;
     memset(Linker,-1,sizeof(Linker));
     for(int u=1;u<=m;u++)
     {
         memset(used,0,sizeof(used));
         if(DFS(u))
             res++;
     }
     return res;
}

int main()
{
     while(scanf("%d%d",&m,&n)!=EOF)
     {
         memset(map,0,sizeof(map));

         while(1)
         {
             int u,v;
             scanf("%d%d",&u,&v);
             if(u==-1&&v==-1)
                break;
             map[u][v]=1;
         }

         int ans=Hungary();
         printf("%d\n",ans);
     }
    return 0;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值