CF546E Soldier and Traveling(网络流,最大流)
CF546E Soldier and Traveling
题目描述
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 \(a_{i}\) soldiers. Now soldiers roam. After roaming each soldier has to either stay in his city or to go to the one of neighboring cities by at moving along at most one road.
Check if is it possible that after roaming there will be exactly \(b_{i}\) soldiers in the i-th city.
输入输出格式
输入格式:
First line of input consists of two integers n n n and m m m ( \(1<=n<=100\) , \(0<=m<=200\) ).
Next line contains \(n\) integers \(a_{1},a_{2},...,a_{n}\) ( \(0<=a_{i}<=100\) ).
Next line contains \(n\) integers \(b_{1},b_{2},...,b_{n}\) ( \(0<=b_{i}<=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.
输出格式:
If the conditions can not be met output single word "NO".
Otherwise output word "YES" and then n n 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.
输入输出样例
输入样例#1: 复制
4 4
1 2 6 3
3 5 3 1
1 2
2 3
3 4
4 2
输出样例#1: 复制
YES
1 0 0 0
2 0 0 0
0 5 1 0
0 0 2 1
输入样例#2: 复制
2 0
1 2
2 1
输出样例#2: 复制
NO
题解
题意大概就是给你 \(n\) 个城市,\(m\) 条边。
然后人只能从走相邻边相连的城市。
现在给你初始城市的每一个人数,再给一组每个城市人数。询问是否可以从当前人数变换到给定人数。如果能,输入“YES”并输出方案,不能则输出“NO”。
网络流就是建图嘛。。。
建好图一般就没有什么难度了qwq(dalao雾怼)
那么怎么建呢?
我们设一个源点和汇点。
然后把一个城市拆成两个点。
入点 \(i\) 限度设为 \(a_i\) ,出点 \(i+n\) 限度设为 \(b_{i}\) 。
这样就只要判断汇点的最大流是否与 \(b_i\) 相等了。
Ps: 原本的人数和后来方案的人数应该相等,且一定要先判定。
怎么输出方案?
看反悔路径的流量就好了。
有就标记一下并输出。
代码
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<queue>
using namespace std;
const int N=1001;
struct node{
int c,to,next;
}e[N<<1];
int num=1,head[N<<3],flag;
int dep[N<<3],n,m,a[N<<3],b[N<<3],sum,tot,s,t;
int map[N][N];
int read(){
int x=0,w=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*w;
}
void add(int from,int to,int c){
num++;
e[num].to=to;
e[num].c=c;
e[num].next=head[from];
head[from]=num;
}
bool bfs(){
memset(dep,0,sizeof(dep));
queue<int>q;q.push(s);dep[s]=1;
while(!q.empty()){
int u=q.front();q.pop();
for(int i=head[u];i;i=e[i].next){
int v=e[i].to;
if(!dep[v]&&e[i].c){
dep[v]=dep[u]+1;q.push(v);
}
}
}
return dep[t];
}
int dfs(int x,int cap){
if(x==t)return cap;
int addx=0;
for(int i=head[x];i;i=e[i].next){
int v=e[i].to;
if(dep[v]==dep[x]+1&&e[i].c){
int tmp=dfs(v,min(cap-addx,e[i].c));
e[i].c-=tmp;e[i^1].c+=tmp;addx+=tmp;
}
}
return addx;
}
int dinic(){
int ans=0;
while(bfs())ans+=dfs(s,10000000);
return ans;
}
int main()
{
n=read();m=read();s=0,t=n+n+1;
for(int i=1;i<=n;i++)a[i]=read(),add(s,i,a[i]),add(i,s,0),tot+=a[i];
for(int i=1;i<=n;i++)b[i]=read(),sum+=b[i],add(i+n,t,b[i]),add(t,i+n,0);
for(int i=1;i<=n;i++)add(i,i+n,99999999),add(i+n,i,0);
for(int i=1;i<=m;i++){
int x=read(),y=read();
// if(x<y)swap(x,y);
add(x,y+n,99999999);add(y+n,x,0);
add(y,x+n,99999999);add(x+n,y,0);
}
//cout<<sum<<' '<<dinic();
if(tot!=sum){printf("NO");return 0;}
int ans=dinic();
if(sum==ans){printf("YES\n");
for(int i=1;i<=n;i++){
for(int j=head[i];j;j=e[j].next){
int v=e[j].to;
if(v>n)
map[i][v-n]=e[j^1].c;
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
cout<<map[i][j]<<' ';
cout<<endl;
}
}
else printf("NO");
return 0;
}
CF546E Soldier and Traveling(网络流,最大流)的更多相关文章
- Codeforces Round #304 (Div. 2)(CF546E) Soldier and Traveling(最大流)
题意 给定 n 个城市,m 条边.人只能从走相邻边相连(只能走一次)的城市. 现在给你初始城市的每一个人数,再给一组每个城市人数.询问是否可以从当前人数变换到给定人数.如果能,输入"YES& ...
- 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(最大流)
题目大概说一张无向图,各个结点初始有ai人,现在每个人可以选择停留在原地或者移动到相邻的结点,问能否使各个结点的人数变为bi人. 如此建容量网络: 图上各个结点拆成两点i.i' 源点向i点连容量ai的 ...
- codeforces 546E. Soldier and Traveling 网络流
题目链接 给出n个城市, 以及初始时每个城市的人数以及目标人数.初始时有些城市是相连的. 每个城市的人只可以待在自己的城市或走到与他相邻的城市, 相邻, 相当于只能走一条路. 如果目标状态不可达, 输 ...
- 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 ...
- Soldier and Traveling
B. Soldier and Traveling Time Limit: 1000ms Memory Limit: 262144KB 64-bit integer IO format: %I64d ...
- POJ 1459-Power Network(网络流-最大流-ISAP)C++
Power Network 时间限制: 1 Sec 内存限制: 128 MB 题目描述 A power network consists of nodes (power stations, cons ...
- [POJ1273][USACO4.2]Drainage Ditches (网络流最大流)
题意 网络流最大流模板 思路 EK也不会超时 所以说是一个数据比较水的模板题 但是POJ有点坑,多组数据,而且题目没给 哭得我AC率直掉 代码 用的朴素Dinic #include<cstdio ...
- HDU 3081 Marriage Match II (网络流,最大流,二分,并查集)
HDU 3081 Marriage Match II (网络流,最大流,二分,并查集) Description Presumably, you all have known the question ...
随机推荐
- Creating a New Master Page in SharePoint 2013
Creating a New Master Page in SharePoint 2013 This article explains how to create a Master Page in S ...
- C++之指针与引用,函数和数组
]={,,}; //ptr是指针,该指针类型是int[3] ]=&arr; cout << **ptr << endl;//第一次解指针时得到数组地址,第二次解指针取数 ...
- python 3.x 学习笔记12 (反射 and 异常)
1.反射通过字符串映射或修改程序运行时的状态.属性.方法 getattr(obj,name_str): 根据字符串name_str去获取obj对象里的对应的方法的内存地址 hasttr(obj,na ...
- (转载) Android RecyclerView 使用完全解析 体验艺术般的控件
Android RecyclerView 使用完全解析 体验艺术般的控件 标签: Recyclerviewpager瀑布流 2015-04-16 09:07 721474人阅读 评论(458) 收藏 ...
- STM8S103 解决Rom空间不足 & Map文件分析
STM8S103只有8KRom,很容易造成空间不足.对于空间不足,我们就要从map文件着手分析,究竟哪些函数占了多少空间,map文件分为几部分:Segments(总括了各个段所占的空间), Modul ...
- css3 -阻止元素成为鼠标事件目标 pointer-events
pointer-events:auto|none 其中pointer-events:none:元素永远不会成为鼠标事件的target. <!DOCTYPE html> <html l ...
- Java将WKT格式的Geomotry转换成GeoJSON
一.Meven添加依赖 <!-- 引入json处理包 --> <dependency> <groupId>com.alibaba</groupId> & ...
- 2015 Multi-University Training Contest 2 hdu 5306 Gorgeous Sequence
Gorgeous Sequence Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Othe ...
- POJ 1741 Tree 树的分治(点分治)
题目大意:给出一颗无根树和每条边的权值,求出树上两个点之间距离<=k的点的对数. 思路:树的点分治.利用递归和求树的重心来解决这类问题.由于满足题意的点对一共仅仅有两种: 1.在以该节点的子树中 ...
- poj_1974,最长回文字串manacher
时间复杂度为O(n),参考:http://bbs.dlut.edu.cn/bbstcon.php?board=Competition&gid=23474 #include<iostrea ...