P2071 座位安排
座位安排
题目背景
公元二零一四年四月十七日,小明参加了省赛,在一路上,他遇到了许多问题,请你帮他解决。
题目描述
已知车上有N排座位,有N\*2个人参加省赛,每排座位只能坐两人,且每个人都有自己想坐的排数,问最多使多少人坐到自己想坐的位置。
输入输出格式
输入格式
第一行,一个正整数N。 第二行至第N\*2+1行,每行两个正整数Si1,Si2,为每个人想坐的排数。
输出格式
一个非负整数,为最多使得多少人满意。
输入输出样例
输入样例 #1
4
1 2
1 3
1 2
1 3
1 3
2 4
1 3
2 3
输出样例 #1
7
说明
对于10%的数据 N≤10 对于30%的数据 N≤50 对于60%的数据 N≤200 对于100%的数据 N≤2000 算法提示:二分图的最大匹配
#include <cstdio> #include <algorithm> #include <cstring> using namespace std; const int N = 16000; int e[N], ne[N], h[N], idx; int n; int vis[N], now; int match[N][2]; void add(int a, int b) { e[idx] = b; ne[idx] = h[a]; h[a] = idx++; } bool find(int x) { for (int i = h[x]; ~i; i = ne[i]) { int j = e[i]; if(vis[j] != now) { vis[j] = now; for(int i = 0; i < 2; i++) { if(!match[j][i] || find(match[j][i])) { match[j][i] = x; return 1; } } } } return 0; } int main() { scanf("%d", &n); memset(h, -1 ,sizeof h); for (int i = 1; i <= n * 2; i++) { int a, b; scanf("%d %d", &a, &b); add(i, a); add(i, b); } int res = 0; for (int i = 1; i <= n * 2; i++) { now++; if (find(i)) res++; } printf("%d", res); return 0; }

浙公网安备 33010602011771号