P2071 座位安排
题目背景
公元二零一四年四月十七日,小明参加了省赛,在一路上,他遇到了许多问题,请你帮他解决。
题目描述
已知车上有N排座位,有N*2个人参加省赛,每排座位只能坐两人,且每个人都有自己想坐的排数,问最多使多少人坐到自己想坐的位置。
输入格式
第一行,一个正整数N。
第二行至第N*2+1行,每行两个正整数Si1,Si2,为每个人想坐的排数。
输出格式
一个非负整数,为最多使得多少人满意。
输入输出样例
输入
4
1 2
1 3
1 2
1 3
1 3
2 4
1 3
2 3
输出
7
说明/提示
对于10%的数据 N≤10
对于30%的数据 N≤50
对于60%的数据 N≤200
对于100%的数据 N≤2000
思路:
像这样有两个不同的集合,问你两集合间最多能有多少匹配的问题。我们都采用最大匹配—二分图。
对于这道题我们如何去变成最大匹配问题呢?(他可是有一排两个座位)
我们一般的匈牙利算法的模板如下:
bool find(int x)
{
for(int i=1; i<=m; i++)
{
if(!cover[i] && e[x][i])
{
cover[i]=1;
int q=link[i];
link[i]=x;
if(!q || find(q)) return 1;
link[i]=q;
}
}
return 0;
}
我们想,link[i]表示右图中i能与左图的哪个数相匹配。
那如果我们把右图看成座位,link[i]表示第i排座位与哪两个人匹配。那大家就很容易想出,题目既然规定一排两个座位,那我们就将link数组开成二维的不就行了。
l i n k [ i ] [ 0 ] 表 示 第 i 排 一 号 座 位 与 哪 个 人 匹 配 link[i][0]表示第i排一号座位与哪个人匹配