網路流24題 圓桌問題

2021-08-27 21:16:18 字數 1265 閱讀 7085

二分圖多重匹配問題,可以用最大流解決。

建立二分圖,每個單位為x集合中的頂點,每個餐桌為y集合中的頂點,增設附加源s和匯t。

1、從s向每個xi頂點連線一條容量為該單位人數的有向邊。

2、從每個yi頂點向t連線一條容量為該餐桌容量的有向邊。

3、x集合中每個頂點向y集合中每個頂點連線一條容量為1的有向邊。

求網路最大流,如果最大流量等於所有單位人數之和,則存在解,否則無解。對於每個單位,從x集合對應點出發的所有滿流邊指向的y集合的頂點就是該單位人員的安排情況(乙個可行解)。

對於乙個二分圖,每個頂點可以有多個匹配頂點,稱這類問題為二分圖多重匹配問題。x,y集合之間的邊容量全部是1,保證兩個點只能匹配一次(乙個餐桌上只能有乙個單位的乙個人),源匯的連邊限制了每個點匹配的個數。求出網路最大流,如果流量等於x集合所有點與s邊容量之和,那麼則說明x集合每個點都有完備的多重匹配。

#include using namespace std;

const int maxn = 1005;

const int maxm = 1005;

const int inf = 0x3f3f3f3f;

struct edge1

;struct dinic

edges.clear();

} void addedge(int from,int to,int cap)

); edges.push_back((edge1));

m = edges.size();

g[from].push_back(m - 2);

g[to].push_back(m - 1);

} bool bfs()

}} return vis[t];

} int dfs(int x,int a)

}return flow;

} int maxflow(int s,int t)

return flow;

}}din;

vectorans[maxn];

int main(void)

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

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

if(sum == din.maxflow(s,t))

}for(int i = 1; i <= m; i++)

printf("\n");}}

else printf("0\n");

return 0;

}

網路流24題 圓桌問題

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

網路流24題 圓桌問題

假設有來自m 個不同單位的代表參加一次國際會議。每個單位的代表數分別為ri i 1,2,m 會議餐廳共有n 張餐桌,每張餐桌可容納ci i 1,2,n 個代表就餐。為了使代表們充分交流,希望從同乙個單位來的代表不在同乙個餐桌就餐。試設計乙個演算法,給出滿足要求的代表就餐方案。對於給定的代表數和餐桌數...

網路流24題 圓桌問題

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