B. Soldier and Traveling

Time Limit: 1000ms
Memory Limit: 262144KB

64-bit integer IO format: %I64d      Java class name: (Any)

In the country there are n cities and m bidirectional roads between them. Each city has an army. Army of the i-th city consists of aisoldiers. Now soldiers roam. After roaming each soldier has to either stay in his city or to go to the one of neighboring cities by atmoving along at most one road.

Check if is it possible that after roaming there will be exactly bi soldiers in the i-th city.

 

Input

First line of input consists of two integers n and m (1 ≤ n ≤ 100, 0 ≤ m ≤ 200).

Next line contains n integers a1, a2, ..., an (0 ≤ ai ≤ 100).

Next line contains n integers b1, b2, ..., bn (0 ≤ bi ≤ 100).

Then m lines follow, each of them consists of two integers p and q (1 ≤ p, q ≤ np ≠ q) denoting that there is an undirected road between cities p and q.

It is guaranteed that there is at most one road between each pair of cities.

 

Output

If the conditions can not be met output single word "NO".

Otherwise output word "YES" and then n lines, each of them consisting of n integers. Number in the i-th line in the j-th column should denote how many soldiers should road from city i to city j (if i ≠ j) or how many soldiers should stay in city i (if i = j).

If there are several possible answers you may output any of them.

 

Sample Input

Input
4 4
1 2 6 3
3 5 3 1
1 2
2 3
3 4
4 2
Output
YES
1 0 0 0
2 0 0 0
0 5 1 0
0 0 2 1
Input
2 0
1 2
2 1
Output
NO
思路:最大流;
首先判断变前和变后的和是否相等,如果不等则直接输出NO,否则,转换为最大流求解,原点和原来的点连边权值为原来的人口,然后每个新的状态和汇点连边,权值为后来的人口,然后
按给的边连边,权值为原来的人口,然后跑最大流,判断最大流量是否为sum。最后的矩阵由反边得来,表示从上个点有人口转移而来,反边的值就是转移人口。
  1 #include<stdio.h>
2 #include<algorithm>
3 #include<iostream>
4 #include<stdlib.h>
5 #include<queue>
6 #include<string.h>
7 #include<map>
8 #include<vector>
9 using namespace std;
10 typedef long long LL;
11 typedef struct pp
12 {
13 int to;
14 int cap;
15 int rev;
16 } aa;
17 vector<pp>vec[205];
18 int level[205];
19 int iter[205];
20 int ans[105];
21 int bns[105];
22 void add(int from,int to,int cap);
23 void bfs(int s);
24 int dfs(int s,int t,int f);
25 int max_flow(int s,int t);
26 const int N = 1e9;
27 int ma[200][200];
28 int main(void)
29 {
30 int n,m;
31 scanf("%d %d",&n,&m);
32 int i,j;
33 int sum1 = 0;
34 int sum2 = 0;
35 for(i = 1; i <= n; i++)
36 {
37 scanf("%d",&ans[i]);
38 sum1 += ans[i];
39 }
40 for(i = 1; i <= n; i++)
41 {
42 scanf("%d",&bns[i]);
43 sum2 += bns[i];
44 }
45 if(sum1 != sum2)
46 printf("NO\n");
47 else
48 {
49 for(i = 1;i <= n; i++)
50 {
51 add(0,i,ans[i]);
52 add(i+n,2*n+1,bns[i]);
53 add(i,i+n,ans[i]);
54 }
55 while(m--)
56 {
57 int x,y;
58 scanf("%d %d",&x,&y);
59 add(x,y+n,ans[x]);
60 add(y,x+n,ans[y]);
61 }
62 int ask = max_flow(0,2*n+1);
63 if(ask != sum1)
64 printf("NO\n");
65 else
66 {
67 for(i = 1;i <= n;i++)
68 {
69 int x = i+n;
70 for(j = 0;j < vec[x].size(); j++)
71 {
72 aa no = vec[x][j];
73 ma[no.to][i] = no.cap;
74 }
75 }printf("YES\n");
76 for(i = 1;i <= n; i++)
77 {
78 for(j = 1;j <= n; j++)
79 {
80 if(j == 1)
81 printf("%d",ma[i][j]);
82 else printf(" %d",ma[i][j]);
83 }
84 printf("\n");
85 }
86 }
87 }return 0;
88 }
89 void add(int from,int to,int cap)
90 {
91 pp nn;
92 nn.to = to;
93 nn.cap = cap;
94 nn.rev = vec[to].size();
95 vec[from].push_back(nn);
96 nn.to = from;
97 nn.cap=0;
98 nn.rev = vec[from].size()-1;
99 vec[to].push_back(nn);
100 }
101 void bfs(int s)
102 {
103 queue<int>que;
104 memset(level,-1,sizeof(level));
105 level[s]=0;
106 que.push(s);
107 while(!que.empty())
108 {
109 int v=que.front();
110 que.pop();
111 int i;
112 for(i=0; i<vec[v].size(); i++)
113 {
114 pp e=vec[v][i];
115 if(level[e.to]==-1&&e.cap>0)
116 {
117 level[e.to]=level[v]+1;
118 que.push(e.to);
119 }
120 }
121 }
122 }
123 int dfs(int s,int t,int f)
124 {
125 if(s==t)
126 return f;
127 for(int &i=iter[s]; i<vec[s].size(); i++)
128 {
129 pp &e=vec[s][i];
130 if(level[e.to]>level[s]&&e.cap>0)
131 {
132 int r=dfs(e.to,t,min(e.cap,f));
133 if(r>0)
134 {
135 e.cap-=r;
136 vec[e.to][e.rev].cap+=r;
137 return r;
138 }
139 }
140 }
141 return 0;
142 }
143 int max_flow(int s,int t)
144 {
145 int flow=0;
146 for(;;)
147 {
148 bfs(s);
149 if(level[t]<0)return flow;
150 memset(iter,0,sizeof(iter));
151 int f;
152 while((f=dfs(s,t,N)) >0)
153 {
154 flow += f;
155 }
156 }
157 }
 

Soldier and Traveling的更多相关文章

  1. Codeforces Round #304 (Div. 2) E. Soldier and Traveling 最大流

    题目链接: http://codeforces.com/problemset/problem/546/E E. Soldier and Traveling time limit per test1 s ...

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

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

  3. 网络流(最大流) CodeForces 546E:Soldier and Traveling

    In the country there are n cities and m bidirectional roads between them. Each city has an army. Arm ...

  4. CF546E Soldier and Traveling

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

  5. 【codeforces 546E】Soldier and Traveling

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  6. Codeforces 546E Soldier and Traveling(最大流)

    题目大概说一张无向图,各个结点初始有ai人,现在每个人可以选择停留在原地或者移动到相邻的结点,问能否使各个结点的人数变为bi人. 如此建容量网络: 图上各个结点拆成两点i.i' 源点向i点连容量ai的 ...

  7. 【CF】304 E. Soldier and Traveling

    基础网络流,增加s和t,同时对于每个结点分裂为流入结点和流出结点.EK求最大流,判断最大流是否等于当前总人数. /* 304E */ #include <iostream> #includ ...

  8. codeforces 546E. Soldier and Traveling 网络流

    题目链接 给出n个城市, 以及初始时每个城市的人数以及目标人数.初始时有些城市是相连的. 每个城市的人只可以待在自己的城市或走到与他相邻的城市, 相邻, 相当于只能走一条路. 如果目标状态不可达, 输 ...

  9. 「日常训练」 Soldier and Traveling (CFR304D2E)

    题意 (CodeForces 546E) 对一个无向图,给出图的情况与各个节点的人数/目标人数.每个节点的人只可以待在自己的城市或走到与他相邻的节点. 问最后是否有解,输出一可行解(我以为是必须和答案 ...

随机推荐

  1. 强化学习实战 | 自定义Gym环境

    新手的第一个强化学习示例一般都从Open Gym开始.在这些示例中,我们不断地向环境施加动作,并得到观测和奖励,这也是Gym Env的基本用法: state, reward, done, info = ...

  2. Hadoop org.apache.hadoop.util.DiskChecker$DiskErrorException问题等价解决linux磁盘不足解决问题排查

    org.apache.hadoop.util.DiskChecker$DiskErrorException问题等价解决linux磁盘不足解决问题排查 解决"/dev/mapper/cento ...

  3. Git(一)【基本使用,集成IDEA,GitHub】

    目录 一.本地库操作 ①基本操作 1.初始化本地库 2.设置用户签名|用户名|邮箱 3.查看本地库状态 4.添加暂存区 5.提交到本地库 6.查看文件modify详情 ②历史版本以及回退 1.查看历史 ...

  4. 前端知识,什么是BFC?

    BFC全称是Block Formatting Context,即块格式化上下文.它是CSS2.1规范定义的,关于CSS渲染定位的一个概念.要明白BFC到底是什么,首先来看看什么是视觉格式化模型. 视觉 ...

  5. iOS 的文件操作

    直接上操作 效果:将一张图片写入文件 (图片本身已经在Assets.xcassets里面了) 1.获取当前app的沙盒路径 NSString *documentPath = NSSearchPathF ...

  6. Linux基础命令---apachectl

    apachectl apachectl指令是apache http服务器的前端控制程序,可以协助控制apache服务的守护进程httpd. 此命令的适用范围:RedHat.RHEL.Ubuntu.Ce ...

  7. redis 之 哨兵

    #:编译安装redis4.0 [root@master ~]# tar xf redis-4.0.14.tar.gz [root@master ~]# cd redis-4.0.14/ [root@m ...

  8. 3.0 rust 项目路径

    $ rustc --versionrustc 1.44.0 (49cae5576 2020-06-01) 将代码存在到不同的文件 main.rs mod aa; fn main() { println ...

  9. Docker常用image

    MySQL Start a mysql server instance Starting a MySQL instance is simple: docker run -itd --name mysq ...

  10. PL/SQL实例1

    declare --定义游标    cursor cemp is select to_char(hiredate,'yyyy') from emp;    phiredate varchar2(4); ...