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