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
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 结束输入。
接下来每行有 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
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;
}