XDUProblem 1078 - 地震和海啸

来源:互联网 发布:windows黑客大曝光 编辑:程序博客网 时间:2024/06/28 10:58

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;}


 

原创粉丝点击