题意: A,B俩个国家分别有 n, m 个代表,,有K 对 可以直接联系,2电话联系;
每个人都需要跟对方联系,求安装最小的电话数;
最多安装 n+m个电话,如果俩个人可以直接联系,那么就可以减少一按安装的电话;
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<string>
#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<list>
#include<map>
#include<set>
using namespace std;
const int N = 1010;
int n, m, k;
vector<int> e[N * 2];
bool vis[N * 2];
int pre[N * 2];
void deal_init(){
for(int i = 1; i <= n+m; i++) e[i].clear();
int a, b;
while(k--){
scanf("%d%d",&a,&b);
b += n;
e[a].push_back(b);
e[b].push_back(a);
}
}
bool dfs(int i){
vector<int>::iterator it;
for(it = e[i].begin(); it != e[i].end(); it++)
if(vis[*it] == 0){
vis[*it] = 1;
if(pre[*it] == 0 || dfs( pre[*it]) ){
pre[*it] = i;
return 1;
}
}
return 0;
}
void work(){
int ans = 0;
memset(pre,0,sizeof(pre));
for(int i = 1; i <= n; i++){
memset(vis,0,sizeof(vis));
if(dfs(i)) ans++;
}
cout << n + m - ans << endl;
}
int main()
{
// freopen("in.in","r",stdin);
while(~scanf("%d%d%d",&n,&m,&k)){
deal_init();
work();
}
return 0;
}