• [网络流24题] 圆桌聚餐


      729. [网络流24题] 圆桌聚餐

    ★★   输入文件:roundtable.in   输出文件:roundtable.out   评测插件
    时间限制:1 s   内存限制:128 MB


      «问题描述:
    假设有来自m 个不同单位的代表参加一次国际会议。每个单位的代表数分别为
    ri(i=1,2,3...m), 。会议餐厅共有n张餐桌,每张餐桌可容纳c i(i=1,2...n) 个代表就餐。
    为了使代表们充分交流,希望从同一个单位来的代表不在同一个餐桌就餐。试设计一个算法,
    给出满足要求的代表就餐方案。
    «编程任务:
    对于给定的代表数和餐桌数以及餐桌容量,编程计算满足要求的代表就餐方案。
    «数据输入:
    由文件roundtable.in提供输入数据。文件第1行有2 个正整数m和n,m表示单位数,n表
    示餐桌数,1<=m<=150, 1<=n<=270。文件第2 行有m个正整数,分别表示每个单位的代表
    数。文件第3 行有n个正整数,分别表示每个餐桌的容量。
    «结果输出:
    程序运行结束时,将代表就餐方案输出到文件roundtable.out中。如果问题有解,在文件第
    1 行输出1,否则输出0。接下来的m行给出每个单位代表的就餐桌号。如果有多个满足要
    求的方案,只要输出1 个方案。
    输入文件示例 输出文件示例
    roundtable.in
     


     

    4 5 4 5 3 5 3 5 2 6 4
    roundtable.out


     

    1 1 2 4 5 1 2 3 4 5 2 4 5 1 2 3 4 5

    分析: 

    比较裸的二分图。若满流,则有解;否则,无解。

    方案输出:对于每一组,把满流的边的右端点依次输出

    显示代码纯文本

    1. #include<cstdio>
    2. #include<cstring>
    3. #include<algorithm>
    4. #define setfile(name) freopen(#name".in","r",stdin);freopen(#name".out","w",stdout);
    5. using namespace std;
    6. const int N=1e4+5;
    7. const int inf=2e9;
    8. struct edge{int v,cap,next;}e[N*10];int tot=1,head[N];
    9. int n,m,S,T,ans,total,dis[N],q[N*10];
    10. void add(int x,int y,int z){
    11. e[++tot].v=y;e[tot].cap=z;e[tot].next=head[x];head[x]=tot;
    12. e[++tot].v=x;e[tot].cap=0;e[tot].next=head[y];head[y]=tot;
    13. }
    14. bool bfs(){
    15. memset(dis,-1,sizeof dis);
    16. unsigned short h=0,t=1;q[t]=S;dis[S]=0;
    17. while(h!=t){
    18. int x=q[++h];
    19. for(int i=head[x];i;i=e[i].next){
    20. if(e[i].cap&&dis[e[i].v]==-1){
    21. dis[e[i].v]=dis[x]+1;
    22. if(e[i].v==T) return 1;
    23. q[++t]=e[i].v;
    24. }
    25. }
    26. }
    27. return 0;
    28. }
    29. int dfs(int x,int f){
    30. if(x==T) return f;
    31. int used=0,t;
    32. for(int i=head[x];i;i=e[i].next){
    33. if(e[i].cap&&dis[e[i].v]==dis[x]+1){
    34. t=dfs(e[i].v,min(e[i].cap,f));
    35. e[i].cap-=t;e[i^1].cap+=t;
    36. used+=t;f-=t;
    37. if(!f) return used;
    38. }
    39. }
    40. if(!used) dis[x]=-1;
    41. return used;
    42. }
    43. inline void out_ans(){
    44. puts("1");
    45. for(int i=1;i<=n;i++){
    46. for(int j=head[i];j;j=e[j].next){
    47. if(!e[j].cap){
    48. printf("%d ",e[j].v-n);
    49. }
    50. }
    51. putchar(' ');
    52. }
    53. }
    54. inline void dinic(){
    55. while(bfs()) ans+=dfs(S,inf);
    56. if(ans==total) out_ans();
    57. else puts("0");
    58. }
    59. inline void init(){
    60. scanf("%d%d",&n,&m);S=0,T=n+m+1;
    61. for(int i=1,x;i<=n;i++) scanf("%d",&x),total+=x,add(S,i,x);
    62. for(int i=1,x;i<=m;i++) scanf("%d",&x),add(i+n,T,x);
    63. for(int i=1;i<=n;i++){
    64. for(int j=1;j<=m;j++){
    65. add(i,j+n,1);
    66. }
    67. }
    68. }
    69. int main(){
    70. setfile(roundtable)
    71. init();
    72. dinic();
    73. return 0;
    74. }


  • 相关阅读:
    C#高性能大容量SOCKET并发(转)
    使用 NuGet 更新套件時將 jQuery 升級到 2.0.2 應該如何降級
    《TD式创新”祸国殃民》
    技术负责人的三种角色
    WaitForSingleObject和CEvent用法
    C++和C#转换
    C#与C/C++的交互
    Introducing .NET Core
    NHibernate的调试技巧和Log4Net配置
    Using Windows Server 2012 Backup for Hyper-V Virtual Machines. Error 80780176
  • 原文地址:https://www.cnblogs.com/shenben/p/6538520.html
Copyright © 2020-2023  润新知