题目链接:http://acm.timus.ru/problem.aspx?space=1&num=1109
题意描述:两组各有M与N名成员,它们分别于对方组的人有预约,现在要为他们之间架设线路,使得每个人都能与对方至少一个有预约的人交流,求最少线路的数量;
简单说来就是一个与最大匹配有关的问题,仿写一遍标准匈牙利算法得到最大匹配项ans,然后总人数减去ans得到输出答案;
AC代码:
//#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <stdio.h>
#include <cstring>
#include <string>
#include <stack>
#include <algorithm>
#include <vector>
#include <queue>
#include <cmath>
#include <map>
#include <iomanip>
using namespace std;
vector<int>visit;
vector<int>link;
vector<vector<bool> >table;
int m, n, k;
bool find(int idx,int depth){
for (int i = 0; i < n;i++)
if (table[idx][i] && visit[i] != depth){
visit[i] = depth;
if (link[i] == -1 || find(link[i], depth)){
link[i] = idx;
return true;
}
}
return false;
}
void func(){
cin >> m >> n >> k;
table.resize(m, vector<bool>(n, false));
link.resize(n, -1);
visit.resize(n, -1);
while (k--){
int src, tar;
cin >> src >> tar;
src--; tar--;
table[src][tar] = true;
}
int ans = 0;
for (int i = 0; i < m; i++){
if (find(i, i))ans++;
}
cout << m + n - ans << endl;
}
int main(){
//freopen("out.txt", "w", stdout);
//freopen("in.txt", "r", stdin);
func();
}
注:这道题在学匈牙利算法之前有试过另一种方法,可能对很多新人或者数学较差的人来说是个误区:
(以上结论经证实为假命题,例如测试用例为:
3 4 6
1 1
1 2
1 3
1 4
2 4
3 4
时,答案错误,画图可知;)