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) 对一个无向图,给出图的情况与各个节点的人数/目标人数.每个节点的人只可以待在自己的城市或走到与他相邻的节点. 问最后是否有解,输出一可行解(我以为是必须和答案 ...
随机推荐
- xmake v2.6.1 发布,使用 Lua5.4 运行时,Rust 和 C++ 混合编译支持
xmake 是一个基于 Lua 的轻量级跨平台构建工具,使用 xmake.lua 维护项目构建,相比 makefile/CMakeLists.txt,配置语法更加简洁直观,对新手非常友好,短时间内就能 ...
- 入坑不亏!我们最终决定将 70w+ 核心代码全部开源
作者 | 一啸 来源 | 尔达 Erda 公众号 背景故事 2017 年初,我们基于 DC/OS (mesos + marathon) 开始构建端点自己的 PaaS 平台,核心任务就是解决公司的软件开 ...
- day29并发编程
day29并发编程 1.进程锁 一.使用锁维护执行顺序 代码: from multiprocessing import Process,Lock import os import time def t ...
- Flume(三)【进阶】
[toc] 一.Flume 数据传输流程 重要组件: 1)Channel选择器(ChannelSelector) ChannelSelector的作用就是选出Event将要被发往哪个Channel ...
- 【leetcode】952. Largest Component Size by Common Factor(Union find)
You are given an integer array of unique positive integers nums. Consider the following graph: There ...
- Oracle—网络配置文件
Oracle网络配置文件详解 三个配置文件 listener.ora.sqlnet.ora.tnsnames.ora ,都是放在$ORACLE_HOME/network/admin目录下. 1 ...
- What all is inherited from parent class in C++?
派生类可以从基类中继承: (1)基类中定义的每个数据成员(尽管这些数据成员在派生类中不一定可以被访问): (2)基类中的每个普通成员函数(尽管这些成员函数在派生类中不一定可以被访问): (3)The ...
- entfrm-boot开发平台功能介绍【entfrm开源模块化无代码开发平台】
简介 entfrm开发平台,是一个以模块化为核心的无代码开发平台,是一个集PC和APP快速开发.系统管理.运维监控.开发工具.OAuth2授权.可视化数据源管理与数据构建.API动态生成与统计.工作流 ...
- 使用Booststrap布局网页页面
<!DOCTYPE html><html lang="zh-CN"><head> <meta charset="utf-8&qu ...
- 【HarmonyOS】【Json解析】ZSON 与 HiJson 使用
HiLog配置 为了方便调试,查看,先设置好Hilog public static final HiLogLabel loglabel = new HiLogLabel(HiLog.LOG_APP,0 ...