即将到来的会议A国派出M个代表,B国派出N个代表 (M and N <= 1000).A国的代表编号为1, 2, ..., M ;B国的代表编号为1, 2, ..., N .开会前,要选择K对代表。每一对代表必须一个是A国的,一个是B国的。A国的成员i与B国的成员j就可结对(If there exists a pair in which both member #i of A and member #j of B are included then #i and #j can negotiate.???)每一个参加会议的代表至少包含在其中一对中。大会的CEO想在代表的房间建立直接的电话联系。所以每个人都至少跟对方的一个人联系起来。每一个电话联系是在有结对关系的人们之间建立的(every connection is made between people that can negotiate.???如何翻译)。CEO想建立最少的电话联系。
input:
首行给定M,N,K。以下K行为结对的代表P1,P2。P1是A国的成员,P2是B国的成员。
output:
输出所需的最少电话联系。分析:最小覆盖==总点数-最大匹配数。【参考程序】:
#include<iostream>
using namespace std;
int n,m,ans;
bool vis[1001],map[1001][1001];
int link[1001];
bool Find(int now)
{
for (int i=1;i<=m;i++)
if (!vis[i] && map[now][i])
{
vis[i]=true;
if (link[i]==0 || Find(link[i]))
{
link[i]=now;
return true;
}
}
return false;
}
int main()
{
int p;
scanf("%d%d%d",&n,&m,&p);
memset(map,false,sizeof(map));
int a,b;
for (int i=1;i<=p;i++)
{
scanf("%d%d",&a,&b);
map[a][b]=true;
}
ans=0;
for (int i=1;i<=n;i++)
{
memset(vis,false,sizeof(vis));
if (Find(i)) ans++;
}
printf("%d\n",n+m-ans);
return 0;
}