LuoguP3254 圓桌問題 最大流

2022-05-09 14:03:09 字數 1693 閱讀 8934

假設有來自m 個不同單位的代表參加一次國際會議。每個單位的代表數分別為ri (i =1,2,……,m)。

會議餐廳共有n 張餐桌,每張餐桌可容納ci (i =1,2,……,n)個代表就餐。

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

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

輸入格式:

第1 行有2 個正整數m 和n,m 表示單位數,n 表示餐桌數,1<=m<=150, 1<=n<=270。

第2 行有m 個正整數,分別表示每個單位的代表數。

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

輸出格式:

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

解題思路:

建立源點匯點。

源點向公司連邊流量為公司人數。

公司向餐桌連邊流量為$1$

餐桌向匯點連邊流量為就餐人數上限。

最大流跑一下就好了。

**:

1 #include2 #include3 #include4

const

int oo=0x3f3f3f3f;5

namespace

stb11

int nxt(int x)

12void clear(void)

13void push(tnt x)

14void pop(void)

15 tnt front(void)

16bool empty(void)

17private:18

tnt l[inf];

19int

h,t;

20#undef inf

21};

22};

23struct

pntp[10000

];28

struct

ente[100000

];33

intcnt;

34int

n,m;

35int

s,t;

36int

n;37 stb::queueq;

38void ade(int f,int t,int

v)39

47bool bfs(void)48

68}69}

70return

false;71

}72int dfs(int x,int

fll)

7388}89

}90return0;

91}92int dinic(void)93

103return

ans;

104}

105int

main()

106124

}125

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

126132

if(dinic()!=sum)

133137 printf("

%d\n

",1);

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

139146 puts(""

);147

}148

return0;

149 }

P3254 圓桌問題

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

P3254 圓桌問題

網路流建模,同時求出最大流的乙個可行流 建模如下 求可行流的方法 遍歷左邊的所有節點,在殘留網路上跑滿了流的邊即為一組解 include using namespace std const int n 430,m n 150 270 2,inf 1e8 int n,m,s,t int h n e m...

P3254 圓桌問題

題目鏈結 非常簡單的一道網路流題 我們發現每個單位的人要坐到不同餐桌上,那也就是說每張餐桌上不能有同一單位的人。這樣的話,我們對於每個單位向每張餐桌連一條邊權為1的邊,表示同一餐桌不得有相同單位的人。從源點向每個單位連一條邊權為人數的邊,從餐桌向匯點連一條邊權為餐桌容量的邊,這樣的話跑最大流,跑出來...