Soldier and Traveling
B. Soldier and Traveling
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 ≤ n, p ≠ 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
4 4
1 2 6 3
3 5 3 1
1 2
2 3
3 4
4 2
YES
1 0 0 0
2 0 0 0
0 5 1 0
0 0 2 1
2 0
1 2
2 1
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的更多相关文章
- 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 ...
- CF546E Soldier and Traveling(网络流,最大流)
CF546E Soldier and Traveling 题目描述 In the country there are \(n\) cities and \(m\) bidirectional road ...
- 网络流(最大流) CodeForces 546E:Soldier and Traveling
In the country there are n cities and m bidirectional roads between them. Each city has an army. Arm ...
- CF546E Soldier and Traveling
题目描述 In the country there are n n n cities and m m m bidirectional roads between them. Each city has ...
- 【codeforces 546E】Soldier and Traveling
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- Codeforces 546E Soldier and Traveling(最大流)
题目大概说一张无向图,各个结点初始有ai人,现在每个人可以选择停留在原地或者移动到相邻的结点,问能否使各个结点的人数变为bi人. 如此建容量网络: 图上各个结点拆成两点i.i' 源点向i点连容量ai的 ...
- 【CF】304 E. Soldier and Traveling
基础网络流,增加s和t,同时对于每个结点分裂为流入结点和流出结点.EK求最大流,判断最大流是否等于当前总人数. /* 304E */ #include <iostream> #includ ...
- codeforces 546E. Soldier and Traveling 网络流
题目链接 给出n个城市, 以及初始时每个城市的人数以及目标人数.初始时有些城市是相连的. 每个城市的人只可以待在自己的城市或走到与他相邻的城市, 相邻, 相当于只能走一条路. 如果目标状态不可达, 输 ...
- 「日常训练」 Soldier and Traveling (CFR304D2E)
题意 (CodeForces 546E) 对一个无向图,给出图的情况与各个节点的人数/目标人数.每个节点的人只可以待在自己的城市或走到与他相邻的节点. 问最后是否有解,输出一可行解(我以为是必须和答案 ...
随机推荐
- Netty4.x 源码实战系列(一): 深入理解ServerBootstrap 与 Bootstrap (1)
从Java1.4开始, Java引入了non-blocking IO,简称NIO.NIO与传统socket最大的不同就是引入了Channel和多路复用selector的概念.传统的socket是基于s ...
- 【分布式】ZooKeeper权限控制之ACL(Access Control List)访问控制列表
zk做为分布式架构中的重要中间件,通常会在上面以节点的方式存储一些关键信息,默认情况下,所有应用都可以读写任何节点,在复杂的应用中,这不太安全,ZK通过ACL机制来解决访问权限问题,详见官网文档:ht ...
- Linux基础命令---mailq显示邮件队列
mailq mailq指令可以显示出待发送的邮件队列. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.Fedora. 1.语法 mailq 2.选项参数列表 ...
- 第7章 使用性能利器——Redis
在现今互联网应用中,NoSQL已经广为应用,在互联网中起到加速系统的作用.有两种NoSQL使用最为广泛,那就是Redis和MongoDB.本章将介绍Redis和Spring Boot的结合.Redis ...
- @Conditional 注解,基于条件实例对象
.catalogue-div { position: relative; background-color: rgba(255, 255, 255, 1); right: 0 } .catalogue ...
- FindUserByPageServlet
package com.hopetesting.web.servlet;import com.hopetesting.domain.PageBean;import com.hopetesting.do ...
- 快速上手ANTLR
回顾前文: ANTLR 简单介绍 ANTLR 相关术语 ANTLR 环境准备 下面通过两个实例来快速上手ANTLR. 使用Listener转换数组 完整源码见:https://github.com/b ...
- Java中的循环结构(二)
循环结构(二) 学习本章有道的单词: rate:速度,比率 young:年轻的,年少 schedule:时间表,调度 neggtive:消极的;否定 customer:顾客,观众 birthday:生 ...
- C++STL标准库学习笔记(三)multiset
C++STL标准库学习笔记(三)multiset STL中的平衡二叉树数据结构 前言: 在这个笔记中,我把大多数代码都加了注释,我的一些想法和注解用蓝色字体标记了出来,重点和需要关注的地方用红色字体标 ...
- [BUUCTF]PWN——[V&N2020 公开赛]warmup
[V&N2020 公开赛]warmup 附件 步骤: 例行检查,64位程序,除了canary,其他保护都开 本地运行一下,看看大概的情况 64位ida载入,从main函数开始看程序 看到程序将 ...