假設有來自 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的有向邊。求網路最大流,如果最大流量等於所有單位人...