这题并不是太难

首先题目我们将每个城市拆点,由源点向一端连容量为初始人数的边,由另一端向汇点连容量为最后人数的边,然后按照题目要求从一端向另一端连容量无穷大的边

这样跑出最大流之后我们只需比较这个流量与总人数是否相等就知道是否合法了

至于输出方案,一个点向另一个点的所有流量都会体现在反向边上,因此我们只需最后统计反向边即可

贴代码:

  1. #include <cstdio>
  2. #include <cmath>
  3. #include <cstring>
  4. #include <cstdlib>
  5. #include <iostream>
  6. #include <algorithm>
  7. #include <queue>
  8. #include <stack>
  9. using namespace std;
  10. const int inf=0x3f3f3f3f;
  11. struct Edge
  12. {
  13. int nxt;
  14. int to;
  15. int val;
  16. }edge[500005];
  17. int head[5005];
  18. int dis[5005];
  19. int cur[5005];
  20. int v0[5005],v1[5005];
  21. int re[105][105];
  22. int cnt=1;
  23. int n,m;
  24. int st,ed;
  25. int sum1=0,sum2=0;
  26. void add(int l,int r,int w)
  27. {
  28. edge[cnt].nxt=head[l];
  29. edge[cnt].to=r;
  30. edge[cnt].val=w;
  31. head[l]=cnt++;
  32. }
  33. void dadd(int l,int r,int w)
  34. {
  35. add(l,r,w),add(r,l,0);
  36. }
  37. int ide(int x)
  38. {
  39. return x&1?x+1:x-1;
  40. }
  41. bool bfs()
  42. {
  43. memset(dis,0,sizeof(dis));
  44. memcpy(cur,head,sizeof(head));
  45. dis[st]=1;
  46. queue <int> M;
  47. M.push(st);
  48. while(!M.empty())
  49. {
  50. int u=M.front();
  51. M.pop();
  52. for(int i=head[u];i;i=edge[i].nxt)
  53. {
  54. int to=edge[i].to;
  55. if(!dis[to]&&edge[i].val)dis[to]=dis[u]+1,M.push(to);
  56. }
  57. }
  58. return dis[ed];
  59. }
  60. int dfs(int x,int lim)
  61. {
  62. if(x==ed)return lim;
  63. int ret=0;
  64. for(int i=cur[x];i;i=edge[i].nxt)
  65. {
  66. int to=edge[i].to;
  67. if(dis[to]==dis[x]+1&&edge[i].val)
  68. {
  69. int temp=dfs(to,min(lim,edge[i].val));
  70. if(temp)
  71. {
  72. ret+=temp,lim-=temp;
  73. edge[i].val-=temp,edge[ide(i)].val+=temp;
  74. if(!lim)break;
  75. }
  76. }
  77. }
  78. return ret;
  79. }
  80. int dinic()
  81. {
  82. int ans=0;
  83. while(bfs())ans+=dfs(st,inf);
  84. return ans;
  85. }
  86. int main()
  87. {
  88. scanf("%d%d",&n,&m);
  89. st=2*n+1,ed=2*n+2;
  90. for(int i=1;i<=n;i++)scanf("%d",&v0[i]),dadd(st,i,v0[i]),sum1+=v0[i];
  91. for(int i=1;i<=n;i++)scanf("%d",&v1[i]),dadd(i+n,ed,v1[i]),sum2+=v1[i];
  92. if(sum1!=sum2){printf("NO\n");return 0;}
  93. for(int i=1;i<=n;i++)dadd(i,i+n,inf);
  94. for(int i=1;i<=m;i++)
  95. {
  96. int x,y;
  97. scanf("%d%d",&x,&y);
  98. dadd(x,y+n,inf),dadd(y,x+n,inf);
  99. }
  100. int t=dinic();
  101. if(t==sum1)
  102. {
  103. printf("YES\n");
  104. for(int i=1;i<=n;i++)
  105. {
  106. for(int j=head[i];j;j=edge[j].nxt)
  107. {
  108. int to=edge[j].to;
  109. if(to>n)re[i][to-n]=edge[ide(j)].val;
  110. }
  111. }
  112. for(int i=1;i<=n;i++,printf("\n"))for(int j=1;j<=n;j++)printf("%d ",re[i][j]);
  113. }else printf("NO\n");
  114. return 0;
  115. }

CF546E的更多相关文章

  1. CF546E Soldier and Traveling(网络流,最大流)

    CF546E Soldier and Traveling 题目描述 In the country there are \(n\) cities and \(m\) bidirectional road ...

  2. CF546E Soldier and Traveling

    题目描述 In the country there are n n n cities and m m m bidirectional roads between them. Each city has ...

  3. Codeforces Round #304 (Div. 2)(CF546E) Soldier and Traveling(最大流)

    题意 给定 n 个城市,m 条边.人只能从走相邻边相连(只能走一次)的城市. 现在给你初始城市的每一个人数,再给一组每个城市人数.询问是否可以从当前人数变换到给定人数.如果能,输入"YES& ...

随机推荐

  1. 2.4 OpenEuler中C语言中的函数调用测试

    2.4 OpenEuler中C语言中的函数调用测试 任务详情 在X86_64架构下实践2.4中的内容 通过GDB查看寄存器的内容,把教材中的图填入具体的值 把2.4的C代码在OpenEuler中重新实 ...

  2. Hadoop集群搭建(详细简单粗暴

    搭建所用Hadoop java版本 hadoop-3.1.3.tar.gz jdk-8u212-linux-x64.tar.gz 安装包链接:Hadoop及jdk安装包提取码:icn6 首先,我们先下 ...

  3. js array map

      var user = ['Alice', 'Emily', 'Kate'];       console.log(user);      var keys = user.keys(); for ( ...

  4. CIL指令和指针类型的操作

    对象引用的使用在CIL中受到严格限制.它们几乎完全被使用带有VOS(Virtual Object System)指令,这些指令是专门为处理对象和部分对象引用而设计的. 常规操作如下: 首先我们需要将加 ...

  5. 实现docker run命令

    基于宿主机来创建容器 执行命令 <自己动手写Docker>code-3.1 ./mydocker run -ti /bin/bash 代码流程 1. 解析参数.2. 通过clone来for ...

  6. BUUCTF-[GXYCTF2019]Ping Ping Ping

    一道命令执行题目    一.基础知识  Linux shell特殊字符(参考链接) [;]作为多个命令语句的分隔符(Command separator [semicolon]). 要在一个语句里面执行 ...

  7. 监听 view 初始化时

    new ViewTreeObserverRegister().observe(getContentView(), new ViewTreeObserver.OnGlobalLayoutListener ...

  8. rest-assured:外部数据驱动之通过CsvFile数据源来使用外部数据源(org.junit.platform.commons.PreconditionViolationException: Classpath resource [repo.csv] does not exist)

    代码: package ghcdgj.restful.framework;import static io.restassured.RestAssured.given;import static io ...

  9. Echarts河南地图下钻

    var parentJson = null; var parentInfo = [{ cityName: '河南', level: 'city', code: 410000, }, ]; getGeo ...

  10. /etc/login.defs 创建用户的默认设置文件

    /etc/login.defs 文件用于在创建用户时,对用户的一些基本属性做默认设置,例如指定用户 UID 和 GID 的范围,用户的过期时间,密码的最大长度,等等.需要注意的是,该文件的用户默认配置 ...