網路流24題之T5 圓桌問題

2021-07-28 17:57:07 字數 1656 閱讀 3475

′問題描述: 

假設有來自 n 個不同單位的代表參加一次國際會議。每個單位的代表數分別

nir ,,2,1, ?= 。會議餐廳共有 m張餐桌,每張餐桌可容納 ),,2,1( mic ?= 個代表就餐。

i i為了使代表們充分交流,希望從同乙個單位來的代表不在同乙個餐桌就餐。試設計乙個演算法

給出滿足要求的代表就餐方案。 

′程式設計任務: 

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

′資料輸入: 

由檔案input.txt提供輸入資料。檔案第 1行有 2 個正整數m和 n,m表示單位數,n表

示餐桌數,1<=m<=150, 1<=n<=270。檔案第2 行有m個正整數,分別表示每個單位的代

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

′結果輸出: 

程式執行結束時,將代表就餐方案輸出到檔案 output.txt 中。如果問題有解,在檔案

1行輸出1,否則輸出0。接下來的m行給出每個單位代表的就餐桌號。如果有多個滿足

求的方案,只要輸出1個方案。 

輸入檔案示例  輸出檔案示例 

input.txt  output.txt 

4 5  1 

4 5 3 5  1 2 4 5 

3 5 2 6 4  1 2 3 4 5 

2 4 5 

1 2 3 4 5 

題解:

裸地二分圖多重匹配問題,最大流解決

建圖方式:

1、s到所有的單位連一條容量為單位人數的邊

2、所有的單位到所有的餐桌分別連一條容量為1的邊

3、所有的餐桌到t連一條容量為餐桌人數的邊

答案即為最大流是否等於所有單位的總人數

#include #include #include using namespace std;

const int maxm=300005;

const int oo=1000000005;

int i,j,n,m,s,t,sum,x,len;

int vis[maxm];

int dis[maxm];

int head[maxm];

int cur[maxm];

struct edge

edge(int x,int y,int z,int w,int t)

} e[maxm];

void add(int u,int v,int c,int f)

int bfs()

} return vis[t];

}int dfs(int x,int a)

return flow;

}int dinic()

return flow;

}int main()

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

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

for(j=1;j<=n;j++)

//for(i=0;i<=len;i++)

//printf("%d:%d %d %d %d %d\n",i,e[i].u,e[i].v,e[i].c,e[i].f,e[i].next);

printf("%d\n",(dinic()==sum));

return 0;

}

網路流24題5 圓桌問題

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

網路流24題 5 圓桌問題 題解

題目鏈結 洛谷 p3254 有來自 m 個不同單位的代表參加一次國際會議。第 i 個單位派出了 r i 個代表。會議的餐廳共有 n 張餐桌,第 i 張餐桌可容納 c i 個代表就餐。為了使代表們充分交流,希望從同乙個單位來的代表不在同乙個餐桌就餐。請給出乙個滿足要求的代表就餐方案。我們考慮從源點向每...

線性規劃與網路流24題 05圓桌問題

建立二分圖,每個單位為x集合中的頂點,每個餐桌為y集合中的頂點,增設附加源s和匯t。1 從s向每個xi頂點連線一條容量為該單位人數的有向邊。2 從每個yi頂點向t連線一條容量為該餐桌容量的有向邊。3 x集合中每個頂點向y集合中每個頂點連線一條容量為1的有向邊。求網路最大流,如果最大流量等於所有單位人...