cf-546E 网络流,状态转移平衡

【信息科学与工程学】【数据科学】数据科学领域 第六篇 算法设计 01 算法设计 阅读详情

E. Soldier and Traveling
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output

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 ai 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 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 test(s)
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

n 个点初始值为a[i],每个点可以将自己的数(只能是原本就属于自己的)加减到相邻点上,是否有方案使得每个点最终值为b[i]。

数的加减都是从一个点到另一个点,内部总量是平衡固定的,这就跟流量是一样的。因此用网络流建模。这种类型的网络流主要就是搞清楚哪些状态和哪些状态保持平衡。

初始状态是a[i]用i点表示,最终状态是b[i]用n+i点表示。用流量表示数值,从源点向i连接容量为a[i]的边,n+i向汇点连接容量为b[i]的边。由初始状态向最终状态转移,存在(u,v)边,则由点u可以流入到点n+v,反过来v,n+u也一样。

然后判断是不是满流(表示数值在给定条件下全部转移成功,每个初始状态的数都分配给了最终状态)就可以了


#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cctype>
#include <string>
#include <vector>
#include <map>
#include <set>
#include <vector>
#include <queue>
#include <stack>
#include <algorithm>
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=210;
struct Edge
{
    int v,cap,flow, nxt;
};

int n,m, N;
int first[maxn],tot;
Edge edge[maxn*maxn*2];

void addedge(int u, int v, int cap)
{
    edge[tot]=Edge{v,cap, 0, first[u]};
    first[u]=tot++;

    edge[tot]=Edge{u,0,0,first[v]};
    first[v]=tot++;
}

int a[maxn],b[maxn];
int sum1,sum2;

void init()
{
    tot=0;
    memset(first, -1, sizeof(first));
    sum1=sum2=0;

    for(int i=1; i<=n; i++)
        scanf("%d", a+i);
    for(int i=1; i<=n; i++)
        scanf("%d", b+i);

    int s=0, t=2*n+1;
    N=t+1;
    for(int i=1; i<=n; i++){
        sum1+=a[i];
        sum2+=b[i];
        addedge(s, i, a[i]);
        addedge(n+i,t, b[i]);
        addedge(i, n+i, inf);
    }

    for(int i=0; i<m; i++){
        int u,v;
        scanf("%d%d", &u, &v);
        addedge(u,n+v, inf);
        addedge(v,n+u, inf);
    }

}


int cur[maxn],dep[maxn],gap[maxn],pre[maxn];

int sap(int st, int ed, int N)
{
    memset(dep, 0, sizeof(dep));
    memset(gap, 0, sizeof(gap));
    memcpy(cur, first, sizeof(first));

    int u=st, ret=0;
    gap[0]=N;
    pre[u]=-1;
    while(dep[st]<N){
        if(u==ed){
            int mini=inf;
            for(int i=pre[u]; i!=-1; i=pre[edge[i^1].v])
                mini=min(mini, edge[i].cap-edge[i].flow);

            for(int i=pre[u]; i!=-1; i=pre[edge[i^1].v]){
                edge[i].flow+=mini;
                edge[i^1].flow-=mini;
            }
            ret+=mini;
            u=st;
            continue;
        }


        bool flag=false;
        for(int i=cur[u]; i!=-1; i=edge[i].nxt){
            int v=edge[i].v;
            if(dep[u]==dep[v]+1 &&edge[i].cap-edge[i].flow>0){
                flag=true;
                cur[u]=pre[v]=i;
                u=v;
                break;
            }
        }
        if(flag) continue;

        int mini=N;
        for(int i=first[u]; i!=-1; i=edge[i].nxt){
            int v=edge[i].v;
            if(dep[v]<mini && edge[i].cap-edge[i].flow>0){
                mini=dep[v];
                cur[u]=i;
            }
        }

        gap[dep[u]]--;
        if(!gap[dep[u]]) return ret;
        dep[u]=mini+1;
        gap[dep[u]]++;
        if(u!=st)
            u=edge[pre[u]^1].v;
    }
    return ret;
}


int ans[maxn][maxn];
int main()
{
    while(cin>>n>>m){
        init();
        int res=sap(0, 2*n+1, N);
        if(res==sum1 && sum1==sum2){
            puts("YES");
            for(int u=1 ; u<=n; u++){
                for(int i=first[u]; i!=-1; i=edge[i].nxt){
                    int v=edge[i].v;
                    if(edge[i].cap){
                        ans[u][v-n]=edge[i].flow;
                    }
                }
            }

            for(int i=1; i<=n; i++){
                for(int j=1; j<n; j++)
                    printf("%d ", ans[i][j]);
                printf("%d\n", ans[i][n]);
            }


        }
        else puts("NO");
    }
    return 0;
}






【信息科学与工程学】计算机科学与自动化——第六十六篇 算子篇 第一章 通用算子01 多模态数据(图形/图像/文本/语音)中推断人类内在状态、策略、动机和利益的算法算子知识库 编号领域算法/方法算子名称算子的数学方程式/表达复杂度 (示例)关联知识11量子场论正则量子化产生/湮灭算符对易关系: [â_p, â†_q] = δ⁽³⁾(p​ - q)应用于态空间,计算复杂度取决于截断福克空间,粒子数表象,二次量子化12统计力学蒙特卡洛模拟马尔可夫链转移算子T(s → s‘) :满足细致平衡条件 π(s)T(s→s’)=π(s‘)T(s’→s)收敛到平衡分布需 ~O(τ), τ为相关时间细致平衡,Metropolis-Hastings准则,重要性采样13电磁学边界元法单层势/双层势算子 阅读详情

相关推荐

【信息科学与工程学】计算机科学与自动化——第三十五篇 调度理论和调度算法01——资源调度算法

算法逻辑

weixin_49199313的博客 682

CF546E Soldier and Traveling 详细图解

CF546E题解

SunnyYuanJiawei的博客 227

【信息科学与工程学】【通信工程】第四篇 通信网络的数学架构10 通信网络核心数学方程式01

卸载:Toffload​=L/R+C/fserver​+Tback​, Eoffload​=Ptx​⋅(L/R)。下层:在切片 s内,为用户 u分配资源,最大化对数效用函数 ∑u​log(ru​), 其中 ru​=∑n∈NRBs​​au,n​⋅SEu,n​, au,n​∈{0,1}表示分配。:在时隙 t, 能量到达 Et​, 电池能量状态 Bt​更新:Bt+1​=min(Bt​−pt​+Et​,Bmax​)。:基站发送:x=α1​P​s1​+α2​P​s2​, α1​+α2​=1, α1​>α2​。

weixin_49199313的博客 370

CF网络流练习

1. 103E 大意: 给定$n$个集合, 满足对于任意的$k$, 任意$k$个集合的并集都不少于$k$. 要求选出$k$个集合$(k> 0)$, 使得并恰好等于$k$, 输出最少花费. Hall定理: 二分图的$X$部到$Y$部有完美匹配等价于$X$中任意$k$个点与$Y$中至少$k$个点相邻. 所有集合为$X$部, 每个数为$Y$部, 集合向所含数连边, 那么一定存在完美...

weixin_30828379的博客 347

银河麒麟V10离线安装VLC播放器:依赖处理与3.0.9.2版本实操指南

在国产化操作系统日益普及的背景下,软件安装方式成为政企内网用户关注的重点。离线安装作为一种不依赖公网源的部署手段,常用于解决内网环境下的软件获取问题。其核心在于理解Linux包管理机制,如dpkg与apt对依赖关系的处理逻辑。掌握这一原理,不仅能应对多媒体软件的部署,也能提升系统维护效率。VLC作为跨平台多媒体播放器,凭借强大的解码能力与协议支持,广泛应用于本地视频播放、RTSP拉流及监控大屏等场景。本文从离线安装的通用概念出发,结合银河麒麟V10桌面版的实际环境,详细梳理了VLC 3.0.9.2离线包的获

weixin_32247165的博客 367

【纯血鸿蒙】安装hdc工具

参考资料:

oh.K 5545

CF 546E(最大流

题目:城市间有若干条道路,士兵可以经过道路到相邻的城市,现在给定初始每个城镇的士兵数目和最终的数目,问是否可以达到最终局面。 思路:关键是建图,首先从源点到初始城镇连边,然后把有边的初始城镇和结束城镇连边,最后把结束城镇和汇点连边,这样就可以保证题目中的“每个士兵最多经过一条道路”的条件,然后求出最大流,如果与城镇总人数相等,那么就有解。输出解的时候只需要把反向边的流量输出即可。 ...

aduqw1129的博客 225

拜耳阵列(Bayer Pattern)以及常见彩色滤波矩阵(CFA)

本文介绍了拜耳阵列的工作原理(Bayer Pattern)以及常用的彩色滤波矩阵(CFA)

风一样的男子(quinta)的博客 7120

【网络流】CF311E Biologist

题意 有一个长度为n的01串,将第i个位置变为另外一个数字的代价是vi​ 。有m个要求 每个要求的形式是 首先确定若干位置都要是0 或者1 然后给定这K 个位置,如果些位置上都满足要求 那么就可以得Wk​ 元 某些要求如果失败了还要倒着给g 元 问最终能够得到的最大利润 分析 先考虑每个位置都改成1,再按照最大权闭合的思想建图 初始为0的点:S->i val 初始为1的点:i->T val 0的要求 S->j w(+g) j->u inf 1的要求 j->T -w(-g) u-

andyc_03的博客 352

使用 Python+PaddleOCR 实现图文识别:从入门到精通

在当今数字化时代,图文识别技术的应用越来越广泛,如文档数字化、信息提取等。PaddleOCR 是百度开源的一款强大的 OCR 工具包,它集成了多种先进的算法和模型,能够高效准确地进行图文识别。本文将详细介绍如何使用 PaddleOCR 和 Python 实现图文识别,并给出具体的代码和步骤。

爱搬砖的程序猿 5474

保姆级教程:在Ubuntu 22.04上,用Chroot和xorriso定制你的专属服务器镜像(附离线包集成)

本文提供了一份详细的Ubuntu 22.04离线镜像定制教程,通过Chroot环境和xorriso工具,帮助用户打造专属服务器镜像。教程涵盖环境准备、镜像解构、系统定制、镜像重组与验证等全流程,特别适合需要在隔离网络环境中批量部署服务器的场景。

weixin_28704565的博客 442

cf#579 E

http://codeforces.com/contest/1203/problem/E E. Boxers time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard output There are n boxers, the weight of the i...

evilwind2000的博客 457

智能环境感知:STM32多传感器数据融合与报警策略设计

本文详细介绍了基于STM32的多传感器数据融合系统设计,整合DHT11温湿度传感器、MQ-2烟雾检测和光照强度检测模块,通过智能算法实现环境感知与动态报警。系统采用数据滤波、多传感器校验和自适应阈值策略,显著提升监测精度与可靠性,并通过OLED显示屏提供清晰的多级报警界面。

plant的博客 200

CF 1214 D Treasure Island 网络流

有一个nm的格子, 一个人起点11, 目的点是nm可以往右/往下走, #为不能走的点, 问做少把几个.改成#(不能改起点和终点)能让这个人不能走到. 当然最多改2个鸭 最小割就是最大流啊 网络流冲冲冲 把图里的每个格子拆成两个点, 其间的流量就是去掉这个点的代价(1), 当然第一个点和最后一个点代价是inf. 然后每个点的2号向其下/右的点的1号连边, 流量是inf. 然后从起点到终点跑网络流就行...

swqeaaa的博客 583

【Bug已解决】npm install -g @anthropic-ai/claude-code 出现 EACCES: permission denied 解决方案

方案适用场景推荐指数nvm 管理 Node长期开发环境,一次配置永久生效⭐⭐⭐⭐⭐修改 npm 全局目录不想引入 nvm,快速解决⭐⭐⭐⭐修复现有目录权限之前用过 sudo 装包,需要修复⭐⭐⭐Windows 管理员/改目录Windows 平台专用⭐⭐⭐⭐官方原生安装脚本想彻底避开 npm 权限问题⭐⭐⭐⭐报的本质是npm 全局安装目录的属主权限与当前执行用户不匹配,而不是 npm 或 Claude Code 本身有问题。不要用sudo"强行"解决。

一键难忘的博客 1万+

ONVIF协议简介与协议测试工具使用详解

Onvif协议及协议测试工具使用详解

dvlinker的技术专栏 3万+

【网络流-最大权闭合子图】CF1082G Petya and Graph

【题目】 原题地址 给定一幅图,求子图的最大权值,权值定义为边权和-点权和。 n,m≤103n,m\leq 10^3n,m≤103,边权≤109\leq 10^9≤109 【解题思路】 十分经典的最小割建图。 对于每个点(id,w)(id,w)(id,w),连(S,id,w)(S,id,w)(S,id,w),对于一条边(id,u,v,w)(id,u,v,w)(id,u,v,w),连(u,id,IN...

MEET YOU FIRST TIME 573

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

2018.1.30 训练日记--网络流+cf

今天继续看的网络流,看的饶齐的博客,见识了网络流各种奇怪的用法。。。 晚上打了一场cf。。C挂了终测,,估计又要掉分。。。。D题一直WA,,也不知道错在哪里,。心好塞。。。

AAAAAAAC的博客 283

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

cf708D Incorrect Flow (网络流)

题意 给定一张不一定合法的有源汇网络(包括每条边的容量与流量),你可以修改边的容量与流量,修改的代价是与原值的距离。问你最小修改代价,使得网络合法。 合法的定义是:每条边流量<=容量,除了源汇之外的点流量平衡 n,m≤100n,m\leq 100n,m≤100 分析 网络流题当然要用网络流解决。 对于c≥fc\geq fc≥f的边,容易发现若最终f′>cf'>cf′>c,...

一位蒟蒻的小博客 260

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

E. Soldier and Traveling(CF546E) Codeforces Round #304 (Div. 2)

E. Soldier and Traveling time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output In the country there are n cities a

寻找&星空の孩子 1150

CF 589F 网络流(or贪心?)

题目链接:http://codeforces.com/problemset/problem/589/F 题意:有n盆菜,每个菜的上菜时间是ai-bi,要求每盆菜的品尝时间都相同,求最大的品尝时间。 思路:一开始也想到了网络流,但是没有想到压缩区域。。。(我只想到一个点一个点地建图,这个的图点可能有10^4个啊。。肯定不能用网络流),后来请教别人可以一个区间建图,流量就是区间长度

qwe2434127的专栏 785

网络流(Network Flow)

转自  http://mindlee.com/2011/11/19/network-flow/ 网络流(Network Flow) 算法学习 | Nov 19, 2011 将每条有向边想象成传输物质的管道。每个管道都有一个固定的容量,可以看作是物质能流经该管道的最大速度(譬如可以想象为水流和河槽)。顶点是管道间的连接点,除了源点(S,Source)和汇点(T,Target

iSummer的专栏 3838

CF546E Soldier and Traveling(最大流)

把每个点拆成两个点跑最大流即可。注意a的和可能和 b的和不相同!

Icefox的博客 598

Codeforces 546E - Soldier and Traveling (最大流)

RT

一只冰熊 1507

CF976F Minimal k-covering(网络流)

对于K-covering 我们建图:原图的边i->n1+j,容量为1.S->左边的点i,容量为du[i]-K,右边的点j->T,容量为du[j]-K。跑最大流。m-最大流就是答案。没流量的边就是还在的边。我们考虑从大到小枚举K,就可以每次直接在残余网络上给每个点新加1的流量,直接跑即可。 因为最大流最大是m的,而我们最多跑m次。所以复杂度是O((n+m)2)O((n+m)^2)

Icefox的博客 457

网络流-最小割

最大流最小割定理:最大流最小割定理是网络流理论的重要定理。是指在一个网络流中,能够从源点到达汇点的最大流量等于如果从网络中移除就能够导致网络流中断的边的集合的最小容量和。即在任何网络中,最大流的值等于最小割的容量。最大流给定指定的一个有向图,其中有两个特殊的点源S(Sources)和汇T(Sinks),每条边有指定的容量(Capacity),求满足条件的从S到T的最大流(MaxFlow)。最小割割...

wust_cyl的博客 1095
上一篇: hdu 3998 最长上升子序列个数+网络流 (最多不相交合法路径数)
下一篇: zoj 2112 Dynamic Rankings 带修改区间第k大的几种解法
HuanTongH
博客等级 码龄12年 7粉丝 110原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值