51nod ﹣ 2006 ﹣ pilot pairing (bipartite maximum matching)
Posted by Allan- on Thu, 30 Apr 2020 22:04:24 +0200
51nod ﹣ 2006 ﹣ pilot pairing (bipartite maximum matching)
Bipartite graph matching template problem
Title Description
During the Second World War, the RAF recruited a large number of foreign pilots from the occupied countries. Each RAF aircraft needs to be equipped with two pilots who can cooperate in navigation skills and language. One is a British pilot and the other is a foreign pilot. Among the numerous pilots, each foreign pilot can cooperate well with several other British pilots. How to choose a pair of pilots to fly in order to send the most aircraft at a time. For a given cooperation between foreign pilots and British pilots, an algorithm is designed to find out the best pilot matching scheme, so that the Royal Air force can dispatch the most aircraft at a time. For a given cooperation between foreign pilots and British pilots, the program finds out an optimal pilot matching scheme, which enables the Royal Air Force to send the most aircraft at a time.
Input
Line 1 has two positive integers m and n. N is the total number of pilots in the RAF (n < 100); m is the number of foreign pilots. Foreign pilots are numbered 1-m; British pilots are numbered m + 1-n. Next, each line has two positive integers i and j, indicating that foreign pilot I can cooperate with British pilot J. The input ends with 2 - 1.
Output
The first line is the maximum number of aircrafts that can be dispatched by the best pilot pairing scheme at a time. Output "No Solution!" if the best pilot matching scheme is not available.
Input sample
5 10
1 7
1 8
2 6
2 9
2 10
3 7
3 8
4 7
4 8
5 10
-1 -1
Output example
Solutions to problems
The template problem of the maximum matching of bipartite graph
AC code
#include<iostream>
#include<vector>
#include<string.h>
using namespace std;
int V;
vector<int> G[105];
int match[105];
bool used[105];
void add_edge(int u, int v) {
G[u].push_back(v);
G[v].push_back(u);
}
bool dfs(int v) {
used[v] = true;
for (int i = 0; i < G[v].size(); ++i) {
int u = G[v][i];
int w = match[u];
if (w < 0 || !used[w] && dfs(w)) {
match[v] = u;
match[u] = v;
return true;
}
}
return false;
}
int bipartite_matching() {
int res = 0;
memset(match, -1, sizeof(match));
for (int v = 0; v < V; v++) {
if (match[v] < 0) {
memset(used, 0, sizeof(used));
if (dfs(v)) {
res++;
}
}
}
return res;
}
int n, m;
void input() {
int s = n;
int t = s + 1;
cin >> m >> n;
V = m;
int ti, tj;
while (cin >> ti >> tj&&(ti!=-1||tj!=-1)) {
add_edge(ti-1, tj-1);
}
}
int main() {
input();
int ans=bipartite_matching();
if (ans < 1)
cout << "No Solution!";
else
cout << ans << endl;
return 0;
}