luogu P2071 座位安排

2021-08-15 09:16:08 字數 1169 閱讀 1552

已知車上有n排座位,有n*2個人參加省賽,每排座位只能坐兩人,且每個人都有自己想坐的排數si1和si2,問最多使多少人坐到自己想坐的位置。

題目 並木有坑人,這題就是乙個二分圖的最大匹配,一邊放人,一邊放座位的排數,注意對於乙個座位是可以承載2個人的,所以乙個人i應該可以在作為si1和si2中分別有2種選擇,所以連邊的時候,i連4條,分別是si1+n,si2+n,si1,si2

然後跑匈牙利就可以了

const

maxn=4001;

var a:array [0..maxn,1..4] of longint;

cover:array [0..maxn] of boolean;

link:array [0..maxn] of longint;

ans,x,y,i,j,n,m:longint;

function

find

(x:longint):boolean;

var i,q:longint;

begin

q:=0;

for i:=1to4

doif cover[a[x,i]] then

begin

q:=link[a[x,i]];

link[a[x,i]]:=x;

cover[a[x,i]]:=false;

if (q=0) or (find(q)) then

exit(true);

link[a[x,i]]:=q;

end;

exit(false);

end;

begin

readln(n);

for i:=1

to2*n do

begin

readln(x,y);

a[i,1]:=x;

a[i,2]:=y;

a[i,3]:=x+n;

a[i,4]:=y+n;

end;

for i:=1

to2*n do

begin

for j:=1

to2*n do cover[j]:=true;

if find(i) then inc(ans);

end;

writeln(ans);

end.

luogu P2071 座位安排

這個題可以被分為兩部分 1.匈牙利演算法 板子 2.鄰接表存圖 好像這不能稱為第二部分 每一排能坐兩個人,那就把一排拆成兩個點,用匈牙利演算法求最大匹配 每個人都只想坐兩排,說明每個人只會連四條邊 如果不會匈牙利的請點這裡 includeusing namespace std const int n...

洛谷P2071 座位安排

座位安排 二分圖,人為左部點,座位為右部點,由於每個座位可以坐兩個人,所以把每個座位拆成兩個點 i 和 i n 如果乙個人想去這個座位則向這兩個點連邊,跑匈牙利即可。include define n 100000 5 using namespace std inline int read while...

數學 AOJ 614 座位安排

description 宣講會上有連續編號為1.n的n個座位,每個座位只能坐乙個人,有n個人,學校有m個不同專業,如果相鄰座位的同學的專業相同,就會發生悄悄話現象,求有多少種情況可能發生悄悄話現象。不一定每個專業都有人來 input 輸入包括多組資料,以檔案 eof 結束。每組測試資料兩個整數n 1...