假設有來自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連一條容量為 桌子容量 的邊...