網路流24題5 圓桌問題

2021-07-27 18:03:33 字數 1435 閱讀 9601

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

。會議餐廳共有 m 張餐桌,每張餐桌可容納ci

個代表就餐。

為了使代表們充分交流,希望從同乙個單位來的代表不在同乙個餐桌就餐。試設計乙個演算法,給出滿足要求的代表就餐方案。

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

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

如果問題有解,在檔案第

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

4 5

4 5 3 5

3 5 2 6 4

1 1 2 4 5

1 2 3 4 5

2 4 5

1 2 3 4 5

同樣是因為不能spj。。日後找到方法會更新的。

每個單位為乙個點,每個餐桌為乙個點。

建圖:

從s點向單位點連一條容量為單位人數的邊。

從餐桌點向t點連一條容量為餐桌人數的邊。

從每個單位點想每個餐桌點連一條容量為1的邊。

分析:

在此圖中流最大流,必然每張餐桌上只可能至多有乙個同乙個單位的人。如果最大流等於總人數,那麼就可行。

而每條單位連向餐桌的滿流邊代表該單位有乙個人坐在這張桌子上。

#include

#include

#include

#include

using namespace std;

const int n = 450, m = 600000 + 10, inf = 0x3f3f3f3f;

struct edgeedg[m];

int hd[n], nxt[m];

int d[n], vis[n], q[n], dfn;

ints, t;

int n, m, ans, tot, sum;

void insert(int u, int v, int w)

void init()

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

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

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

insert(i, j + m, 1);

}bool bfs()

}return vis[t] == dfn;

}int dfs(int

x, int a)

}return flow;

}void work()

int main()

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

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

網路流24題之T5 圓桌問題

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

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

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