[网络流24题] 圆桌聚餐

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

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



 

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('\n');
  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. }


转载于:https://www.cnblogs.com/shenben/p/6538520.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值