網路流24題 圓桌問題

2022-05-19 09:50:27 字數 1333 閱讀 7052

題目:洛谷p3254。

題目大意:

有n個單位和m張桌子,每個單位有一定的人數,每張桌子也有一定的容量。一張桌子上不能有兩個同一單位的人。現在問你能否坐下,若能則輸出一種方案。

解題思路:

最大流。

從s向每個單位連一條容量為(單位人數)的邊,代表這個單位有那麼多人。

從每張桌子向t連一條容量為(桌子容量)的邊,代表這張桌子能做那麼多人。

從每個單位向每張桌子連一條容量為1的邊,代表每個單位在一張桌子上只能坐乙個人。

然後若最大流量不等於總人數,則無解。否則有解。

輸出方案,就列舉邊,對於一條從單位流向桌子的邊,若跑完剩餘容量為0,則該單位在這張桌子上坐了人。

c++ code:

#include#define s 0

#define t 1000

struct edgee[200000];

inline int readint()

int cnt=1,n,m,head[1005],s=0,level[1005],iter[1005];

std::vectorv[300];

inline int addedge(const int u,const int v,const int t);

head[u]=cnt;

e[++cnt]=(edge);

head[v]=cnt;

}std::queueq;

inline int min(const int a,const int b)

} return 0;

}int dinic()

}int main()

for(int i=1;i<=m;++i)addedge(n+i,t,readint());

for(int i=1;i<=n;++i)

for(int j=1;j<=m;++j)

addedge(i,n+j,1);

if(dinic()!=s)return puts("0"),0;

puts("1");

for(int i=1;i<=cnt;++i)

if(e[i].from<=n&&e[i].from&&e[i].to>n&&e[i].to<=n+m&&!e[i].cap)v[e[i].from].push_back(e[i].to-n);

for(int i=1;i<=n;++i)

if(v[i].size())else putchar('\n');

return 0;

}

網路流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 個代表就餐。為了使代表們充分交流,希望從同乙個單位來的代表不在同乙個餐桌就餐。試設計乙個演算法,給出滿足要求的代表就餐方案。對於給定的代表數和餐桌數...