这题并不是太难

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

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

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

贴代码:

#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
using namespace std;
const int inf=0x3f3f3f3f;
struct Edge
{
int nxt;
int to;
int val;
}edge[500005];
int head[5005];
int dis[5005];
int cur[5005];
int v0[5005],v1[5005];
int re[105][105];
int cnt=1;
int n,m;
int st,ed;
int sum1=0,sum2=0;
void add(int l,int r,int w)
{
edge[cnt].nxt=head[l];
edge[cnt].to=r;
edge[cnt].val=w;
head[l]=cnt++;
}
void dadd(int l,int r,int w)
{
add(l,r,w),add(r,l,0);
}
int ide(int x)
{
return x&1?x+1:x-1;
}
bool bfs()
{
memset(dis,0,sizeof(dis));
memcpy(cur,head,sizeof(head));
dis[st]=1;
queue <int> M;
M.push(st);
while(!M.empty())
{
int u=M.front();
M.pop();
for(int i=head[u];i;i=edge[i].nxt)
{
int to=edge[i].to;
if(!dis[to]&&edge[i].val)dis[to]=dis[u]+1,M.push(to);
}
}
return dis[ed];
}
int dfs(int x,int lim)
{
if(x==ed)return lim;
int ret=0;
for(int i=cur[x];i;i=edge[i].nxt)
{
int to=edge[i].to;
if(dis[to]==dis[x]+1&&edge[i].val)
{
int temp=dfs(to,min(lim,edge[i].val));
if(temp)
{
ret+=temp,lim-=temp;
edge[i].val-=temp,edge[ide(i)].val+=temp;
if(!lim)break;
}
}
}
return ret;
}
int dinic()
{
int ans=0;
while(bfs())ans+=dfs(st,inf);
return ans;
}
int main()
{
scanf("%d%d",&n,&m);
st=2*n+1,ed=2*n+2;
for(int i=1;i<=n;i++)scanf("%d",&v0[i]),dadd(st,i,v0[i]),sum1+=v0[i];
for(int i=1;i<=n;i++)scanf("%d",&v1[i]),dadd(i+n,ed,v1[i]),sum2+=v1[i];
if(sum1!=sum2){printf("NO\n");return 0;}
for(int i=1;i<=n;i++)dadd(i,i+n,inf);
for(int i=1;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
dadd(x,y+n,inf),dadd(y,x+n,inf);
}
int t=dinic();
if(t==sum1)
{
printf("YES\n");
for(int i=1;i<=n;i++)
{
for(int j=head[i];j;j=edge[j].nxt)
{
int to=edge[j].to;
if(to>n)re[i][to-n]=edge[ide(j)].val;
}
}
for(int i=1;i<=n;i++,printf("\n"))for(int j=1;j<=n;j++)printf("%d ",re[i][j]);
}else printf("NO\n");
return 0;
}

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. 记录 springboot 整合swagger2 出现documentationPluginsBootstrapper&&NullPointerException异常

    记录 由于springboot版本高 整合swagger2出现null异常 springboot 版本: swagger2 依赖版本: 出现的异常: 解决方案: application 添加如下依赖 ...

  2. Charles抓包工具详解

    学习Charles能做什么: 能够用charles分析前后端问题 能够使用charles模拟弱网测试环境 能够使用charles断点构建异常的测试环境 Charles 简介 1.Charles是什么? ...

  3. nanopi SOCKS5 代理

    nanopi (SOCKS5+openvpn)  +  阿里ES(openvpn + socat) 构建内网代理. 需求: 公网 阿里ES服务器1台,内网nanopi1个(可连接公网服务器), 想从外 ...

  4. eFuse技术

    1. 基本概况及介绍   不同于大多数FPGA使用的SRAM阵列,eFuse一次只有一根熔丝能够被编程,这是该方法的配置能力存在限制范围的原因.但当与日益成熟的内置自测试(BIST)引擎组合使用时,这 ...

  5. 服务器IPMI地址及用户名密码

    HP管理口:ILO默认用户/密码:Administrator/passwordHP以前管理口登陆MP卡通过网线连接MP卡的RJ-45口,通过telnet方式登录,默认用户/密码:Admin/Admin ...

  6. xfce-debian10 英文环境安装配置记录

    Centos还没有用利索(因为我听说debian是更纯正的社区开源项目???可是这对于我这样毫无技术菜鸟来说有什么关系呢???可是耐不住心中的悸动???悸动又从哪里了呢???哎,不管了),突然心血来潮 ...

  7. LeetCode习题集

    作为一名本科计算机科学与技术的学生,<数据结构与算法><算法分析与设计>这两门课没有学到特别好 上了研究生之后感觉,这些东西需要重新拾起 于是,我找了一个平台,LeetCode ...

  8. 解题报告:Codeforces 768B Code For 1

    Codeforces 768B Code For 1 题义 有一个序列,刚开始,只有1个数\(n\),接着按照以下规则变化找到序列中任意一个\(>1\)的数\(p\),将他变为 \(\lfloo ...

  9. VS Code 快速下载

    最近在官网下载Visual Studio Code时,下载速度特别慢,经过搜索后发现,将下载地址前部分更换为国内地址后,下载速度飞快. 具体步骤如下: VSCodeSetup-x64-1.72.0 官 ...

  10. SAP Process Orchestration (SAP PO): The Comprehensive Guide (2nd Edition) (SAP PRESS)

    SAP Process Orchestration (SAP PO): The Comprehensive Guide (2nd Edition) (SAP PRESS) 有需要的联系 wx :erp ...