網路流24題 圓桌問題

2021-10-02 12:00:35 字數 1902 閱讀 2023

假設有來自m 個不同單位的代表參加一次國際會議。每個單位的代表數分別為ri (i =1,2,……,m)。

會議餐廳共有n 張餐桌,每張餐桌可容納ci (i =1,2,……,n)個代表就餐。

為了使代表們充分交流,希望從同乙個單位來的代表不在同乙個餐桌就餐。試設計乙個演算法,給出滿足要求的代表就餐方案。

對於給定的代表數和餐桌數以及餐桌容量,程式設計計算滿足要求的代表就餐方案。

第1 行有2 個正整數m 和n,m 表示單位數,n 表示餐桌數,1<=m<=150, 1<=n<=270。

第2 行有m 個正整數,分別表示每個單位的代表數。

第3 行有n 個正整數,分別表示每個餐桌的容量。

如果問題有解,第1 行輸出1,否則輸出0。接下來的m 行給出每個單位代表的就餐桌號。如果有多個滿足要求的方案,只要輸出1 個方案。

輸入輸出樣例

輸入 #1

4 54 5 3 5

3 5 2 6 4

輸出 #1

11 2 4 5

1 2 3 4 5

2 4 5

1 2 3 4 5

建超級源點和超級匯點,源點向每個代表連一條 r

ir_i

ri​ 的邊,每個桌子向匯點連一條 c

ic_i

ci​ 的邊,中間是個完全圖,如圖。

跑最大流即可。

乙個流表示乙個代表坐到了一張桌子上。

輸出方案的話,看哪些邊是 0

00 邊就好了,說明這條邊被流過。

用的是萌萌的 isa

pisap

isap

演算法求最大流。

#include

#define n 100005

#define inf 2147483647

using

namespace std;

struct noded[n *2]

;int dep[n]

, gap[n]

, h[n]

, sum, cnt =

1, ans, cur[n]

, s, t, n, m, tot, a[n]

, b[n]

;voidcr(

int a,

int b,

int c)

void

bfs(

int a)}}

}int

sap(

int a,

int flow)

if(used == flow)

return used;}}

gap[dep[a]]--

;if(!gap[dep[a]

]) dep[s]

= tot +5;

dep[a]++;

gap[dep[a]]++

;return used;

}int

main()

}for

(i =

1; i <= n; i++)cr

(s, i, a[i]),

cr(i, s,0)

;for

(i =

1; i <= m; i++)cr

(i + n, t, b[i]),

cr(t, i + n,0)

;bfs

(t);

while

(dep[s]

< tot +1)

if(ans != sum)

printf

("0");

else

}printf

("\n");

}}return0;

}

網路流24題 圓桌問題

click me 從原點向每乙個單位連一條流量為單位人數的邊,單位和桌子間連一條流量為1的邊,桌子和匯點之間連一條流量為桌子容量的邊,跑最大流即可。au hany01 date jan 13th,2018 prob luogu3254 email hany01 foxmail.com include...

網路流24題 圓桌問題

二分圖多重匹配問題,可以用最大流解決。建立二分圖,每個單位為x集合中的頂點,每個餐桌為y集合中的頂點,增設附加源s和匯t。1 從s向每個xi頂點連線一條容量為該單位人數的有向邊。2 從每個yi頂點向t連線一條容量為該餐桌容量的有向邊。3 x集合中每個頂點向y集合中每個頂點連線一條容量為1的有向邊。求...

網路流24題 圓桌問題

題目 洛谷p3254。題目大意 有n個單位和m張桌子,每個單位有一定的人數,每張桌子也有一定的容量。一張桌子上不能有兩個同一單位的人。現在問你能否坐下,若能則輸出一種方案。解題思路 最大流。從s向每個單位連一條容量為 單位人數 的邊,代表這個單位有那麼多人。從每張桌子向t連一條容量為 桌子容量 的邊...