description
假設有來自$n$個不同單位的代表參加一次國際會議。每個單位的代表數分別為$r_i(i\;\in\;[1,n])$。會議餐廳共有$m$張餐桌,每張餐桌可容納$c_i(i\;\in\;[1,m])$個代表就餐。為了使代表們充分交流,希望從同乙個單位來的代表不在同乙個餐桌就餐。求滿足要求的代表就餐方案。
input
第$1$行有$2$個正整數$m,n.m$表示單位數,$n$表示餐桌數。
第$2$行有$m$個正整數,分別表示每個單位的代表數。
檔案第$3$行有$n$個正整數,分別表示每個餐桌的容量。
output
如果問題有解,第$1$行輸出$1$,否則輸出$0$。
接下來的$m$行給出每個單位代表的就餐桌號。如果有多個滿足要求的方案,只要輸出$1$個方案。
sample input
4 5
4 5 3 5
3 5 2 6 4
sample output
1
1 2 4 5
1 2 3 4 5
2 4 5
1 2 3 4 5
hint
$1\;\leq\;m\;\leq\;150,1\;\leq\;n\;\leq\;270$
solution
單位$i$為$x_i$,餐桌$i$為$y_i$,建立二分圖.
從$s$向$x_i$連線一條容量為$r_i$的有向邊,
從$x_i$向$y_j$連線一條容量為$1$的有向邊,
從$y_i$向$t$連線一條容量為$c_i$的有向邊,
如果最大流=人數和,則有解,從集合$x$從發流向集合$y$的滿流邊為當前方案.
#include#include#include
#include
#include
#include
#include
#include
#include
#include
#define n 275
#define m 155
using
namespace
std;
struct
graphe[(n*m)<<1
];int a[m],b[n],g[n+m],dep[n+m],n,m,s,t,sum,cnt=1
;queue
q;inline
void addedge(int x,int y,int
f) inline
void adde(int x,int y,int
f)inline
bool bfs(int
u) }
return
dep[t];
}inline
int dfs(int u,int
f)
return
ret;
}inline
intdinic()
}inline
void
aireen()
for(int i=1;i<=n;++i)
for(int i=1;i<=m;++i)
for(int j=n;j;--j)
adde(i,j+m,1
);
if(dinic()==sum)
}else puts("0"
);
}int
main()
網路流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題 圓桌問題
假設有來自m 個不同單位的代表參加一次國際會議。每個單位的代表數分別為ri i 1,2,m 會議餐廳共有n 張餐桌,每張餐桌可容納ci i 1,2,n 個代表就餐。為了使代表們充分交流,希望從同乙個單位來的代表不在同乙個餐桌就餐。試設計乙個演算法,給出滿足要求的代表就餐方案。對於給定的代表數和餐桌數...