POJ 2396 Budget (有源汇有上下界的可行流)

使用兮克 2.5G 交换机将北京联通 EPON 改为 ODI 猫棒接入 最近入手了兮克2.5G交换机(兮克SKS1200-8GPY1XF),有 8 个 2.5G 电口和 1 个 10G SFP+ 光口;支持多种组网模式,其中一种是支持使用猫棒接入,由路由器拨号后再回接到交换机,这样就可以替换掉光猫了。 阅读详情

POJ 2396 Budget 


题意:给定一个M*N的矩阵,给定每行每列的和,以及其中一些值的限定条件,问能否构成一个可行的矩阵。

思路:
添加一个源点,向每行连边,每条边的上下界都为该行的和;添加一个汇点,每列向汇点连边,边的上下界都为该列的和。然后每行向每列连边,边的上下界一开始为(0,INF),之后通过一些限定条件更新。
现在问题成了求一个有源汇有上下界的可行流。只需要再添加一个超级源点,一个超级汇点,并且将原图的汇点向源点连边,求一个可行流即可。

细节:这道题目的构图比较麻烦。

/*
ID: wuqi9395@126.com
PROG:
LANG: C++
*/
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<cmath>
#include<cstdio>
#include<vector>
#include<string>
#include<fstream>
#include<cstring>
#include<ctype.h>
#include<iostream>
#include<algorithm>
using namespace std;
#define INF (1 << 30)
#define LINF (1LL << 60)
#define PI acos(-1.0)
#define mem(a, b) memset(a, b, sizeof(a))
#define rep(i, a, n) for (int i = a; i < n; i++)
#define per(i, a, n) for (int i = n - 1; i >= a; i--)
#define eps 1e-6
#define debug puts("===============")
#define pb push_back
#define mkp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
#define POSIN(x,y) (0 <= (x) && (x) < n && 0 <= (y) && (y) < m)
typedef long long ll;
typedef unsigned long long ULL;
const int maxn = 2000;
const int maxm = 2000000;
struct node {
    int v;    // vertex
    int cap;    // capacity
    int flow;   // current flow in this arc
    int nxt;
} e[maxm * 2];
int g[maxn], cnt;
int st, ed, n, N, M, S, T;
int id[maxm];
void add(int u, int v, int c, int k) {
    e[++cnt].v = v;
    e[cnt].cap = c;
    e[cnt].flow = 0;
    e[cnt].nxt = g[u];
    g[u] = cnt;
    id[k] = cnt;

    e[++cnt].v = u;
    e[cnt].cap = 0;
    e[cnt].flow = 0;
    e[cnt].nxt = g[v];
    g[v] = cnt;
    id[0] = 0;
}
int sum1, sum2;
int low[maxm], up[maxm], tot[maxn];
bool flag;
bool set_edge(int i, int j, char* str, int c) {
    int x = (i - 1) * N + j;
    if (str[0] == '=') {
        if (low[x] <= c && c <= up[x]) low[x] = up[x] = c;
        else return false;
    }
    else if (str[0] == '<') {
        if (low[x] < c) up[x] = min(up[x], c - 1);
        else return false;
    }
    else if (str[0] == '>') {
        if (up[x] > c) low[x] = max(low[x], c + 1);
        else return false;
    }
    return true;
}
int sum;
void init() {
    memset(g, 0, sizeof(int) * (M + N + 10));
    memset(tot, 0, sizeof(int) * (M + N + 10));
    cnt = 1;
    st = M + N + 2, ed = M + N + 3;
    S = 0, T = M + N + 1;
    int u, v, c;
    sum1 = sum2 = 0;
    for (int i = 1; i <= M; i++) {
        scanf("%d", &c);
        tot[S] -= c;
        tot[i] += c;
        sum1 += c;
    }
    for (int i = 1; i <= N; i++) {
        scanf("%d", &c);
        tot[T] += c;
        tot[i + M] -= c;
        sum2 += c;
    }
    flag = true;
    if (sum1 != sum2) flag = false;
    int k;
    scanf("%d", &k);
    memset(low, 0, sizeof(int) * (M * N + 10));
    fill(up, up + sizeof(int) * (M * N + 10), INF);
    char str[10];
    while(k--) {
        scanf("%d%d%s%d", &u, &v, str, &c);
        if (flag) {
            int rst, red, cst, ced;
            if (u == 0) rst = 1, red = M;
            else rst = red = u;
            if (v == 0) cst = 1, ced = N;
            else cst = ced = v;
            for (int i = rst; i <= red; i++) {
                for (int j = cst; j <= ced; j++) {
                    if (!set_edge(i, j, str, c)) {
                        flag = false;
                        goto FK;
                    }
                }
            }
            FK:;
        }
    }
    if (!flag) return ;
    add(T, S, INF, 0);
    for (int i = 1; i <= M; i++) {
        for (int j = 1; j <= N; j++) {
            int x = (i - 1) * N + j;
            tot[i] -= low[x];
            tot[j + M] += low[x];
            add(i, j + M, up[x] - low[x], x);
        }
    }
    sum = 0;
    for (int i = 0; i <= M + N + 1; i++) {
        if (tot[i] > 0) add(st, i, tot[i], 0), sum += tot[i];
        if (tot[i] < 0) add(i, ed, -tot[i], 0);
    }
    n = ed + 3;
}
int dist[maxn], numbs[maxn], q[maxn];
void rev_bfs() {
    int font = 0, rear = 1;
    for (int i = 0; i <= n; i++) { //n为总点数
        dist[i] = maxn;
        numbs[i] = 0;
    }
    q[font] = ed;
    dist[ed] = 0;
    numbs[0] = 1;
    while(font != rear) {
        int u = q[font++];
        for (int i = g[u]; i; i = e[i].nxt) {
            if (e[i ^ 1].cap == 0 || dist[e[i].v] < maxn) continue;
            dist[e[i].v] = dist[u] + 1;
            ++numbs[dist[e[i].v]];
            q[rear++] = e[i].v;
        }
    }
}
int maxflow() {
    rev_bfs();
    int u, totalflow = 0;
    int curg[maxn], revpath[maxn];
    for(int i = 0; i <= n; ++i) curg[i] = g[i];
    u = st;
    while(dist[st] < n) {
        if(u == ed) {   // find an augmenting path
            int augflow = INF;
            for(int i = st; i != ed; i = e[curg[i]].v)
                augflow = min(augflow, e[curg[i]].cap);
            for(int i = st; i != ed; i = e[curg[i]].v) {
                e[curg[i]].cap -= augflow;
                e[curg[i] ^ 1].cap += augflow;
                e[curg[i]].flow += augflow;
                e[curg[i] ^ 1].flow -= augflow;
            }
            totalflow += augflow;
            u = st;
        }
        int i;
        for(i = curg[u]; i; i = e[i].nxt)
            if(e[i].cap > 0 && dist[u] == dist[e[i].v] + 1) break;
        if(i) {   // find an admissible arc, then Advance
            curg[u] = i;
            revpath[e[i].v] = i ^ 1;
            u = e[i].v;
        } else {    // no admissible arc, then relabel this vertex
            if(0 == (--numbs[dist[u]])) break;    // GAP cut, Important!
            curg[u] = g[u];
            int mindist = n;
            for(int j = g[u]; j; j = e[j].nxt)
                if(e[j].cap > 0) mindist = min(mindist, dist[e[j].v]);
            dist[u] = mindist + 1;
            ++numbs[dist[u]];
            if(u != st)
                u = e[revpath[u]].v;    // Backtrack
        }
    }
    return totalflow;
}
int main () {
    int T;
    scanf("%d", &T);
    while(T--) {
        scanf("%d%d", &M, &N);
        init();
        if (!flag) puts("IMPOSSIBLE");
        else {
            int dd = maxflow();
            if (dd != sum) {
                puts("IMPOSSIBLE");
                continue;
            }
            for (int i = 1; i <= M; i++) {
                for (int j = 1; j <= N; j++) {
                    int x = (i - 1) * N + j;
                    printf("%d%c", low[x] + e[id[x]].flow, j == N ? '\n' : ' ');
                }
            }
        }
        if (T) puts("");
    }
    return 0;
}


Linux内核4.14版本——drm框架分析(1)——drm简介 本文介绍了DRM架构的发展历史、驱动框架以及简单示例,旨在帮助读者了解DRM架构的形成、功能流程实现。 阅读详情

相关推荐

群晖NAS变身私有Git服务器:DS218+部署与TortoiseGit客户端实战指南

本文详细介绍了如何将群晖NAS(如DS218+)变身为私有Git服务器,并配置TortoiseGit客户端实现高效代码管理。通过硬件检查、系统更新、Git Server套件安装及权限配置等步骤,帮助开发者在局域网内搭建安全、高速的代码托管环境,特别适合小团队协作。

weixin_29252171的博客 223

[BZOJ2406]矩阵(二分+有源汇有上下界的可行流)

题目描述传送门题解刚开始没看见绝对值。。。 把这道题翻译一下其实就是构造一个b矩阵,其中每一个点有限制[L,R],令矩阵c=a-b,使c矩阵每一行的和的绝对值和每一列的和的绝对值的最大值最小最大值最小很容易想到二分 二分答案mid之后,用网络流判定 就是满足|∑ai−∑bi|≤mid|\sum a_i-\sum b_i|\le mid 分类讨论一下得出∑ai−mid≤∑bi≤∑ai+mid\

zyf2000 1551

汽车零部件智能装配:C#+YOLOv8实现螺栓漏装检测与齿轮错位识别(附PLC通信与机械臂控制)

YOLOv8:小目标检测的最优解相比YOLOv7,YOLOv8的C2f特征融合网络对小目标(5-10mm螺栓)检测精度提升12%,且推理速度快8%;支持大输入尺寸(不显著增加耗时),可放大螺栓细节;官方提供yolov8n.pt(nano版),在边缘计算盒上能跑40+FPS,满足实时性。C#:工业软件的“兼容性核心”主流PLC(西门子S7-1200/1500)、机械臂(ABB、KUKA)的SDK多基于.NET开发,C#可直接调用,避免跨语言通信延迟;多线程管理成熟(Task。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1146

Budget

1.创建Budget …内容类似BudgetDomian 2.查询Budget // /api/v1/budgets/info class BudgetInfoDto { private BigDecimal globalAmount; // 全局预算 private BigDecimal amount; // 用户预算 private BigDecimal globalBalance...

qq1159946129的博客 1029

S32K144之芯片锁死解锁——进入HardFault

S32K144之芯片锁死解锁——进入HardFault 最近遇到因为软件代码问题导致进入HardFault,从而使芯片锁死,来简述具体现象以及最终的解锁方法。 导致原因:如下图,在进行Gpio的相关配置,case后面没有break语句,导致芯片进入HardFault。 现象1:reset引脚持续为低,reset指示灯常亮。如果掉电后重新上电,通过示波器抓取reset引脚的波形,会有510us左右或者29ms左右的低电平脉冲出现,一般会出现两三次左右并且没有规矩,持续几秒的高电平之后,reset脚再次被拉低

weixin_41935674的博客 8274

java三角套利_三角对冲套利-EA原理全解析

它是两个直盘货币和一个交叉盘货币之间的相互对冲,交易员往往受到外界因素的影响无法严格执行造成亏损。该系统经过大量数据统计分析和严格的科学论证计算,并通过多年实盘交易验证可以达到稳定盈利。希望交易员严格按照交易规则执行。此策略利用交叉外汇对的市场价格与其合成价格的价差来实现套利,还以EUR/USD和GBP为例:1,我们关注三个外汇对:EUR/USD,GBP/USD,以及GBP/EUR2,计算GBP/...

weixin_29531897的博客 2418

POJ 2396:Budget (有流量上下界的网络流)

有流量上下界的网络流,经典题目。

温姑娘的博客 585

Golang实现企业级AI智能体安全合规自动化检测系统

需求:自动化解析欧盟AI法案、中国网络安全法、美国NIST框架等多国法规,提取具体合规要求并映射到企业技术实现。技术挑战法规文本非结构化,语义复杂,存在大量法律术语与技术术语交叉多语言支持(中文、英文、欧盟24种官方语言)法规动态更新(平均每季度更新2-3次)架构创新性:提出了"规则引擎+AI模型+实时监控"的混合架构,兼顾了合规要求的明确性与智能体行为的动态性。性能突破:通过Golang协程、多级缓存、数据库优化等技术,实现了12,800 req/s的高吞吐量和38ms的低延迟。准确性提升。

shao.bing的专栏 722

有源汇上下界可行流(POJ2396)

题意:给出一个n*m的矩阵的每行和及每列和,还有一些格子的限制,求一组合法方案。 源点向行,汇点向列,连一条上下界均为和的边。 对于某格的限制,从它所在行向所在列连其上下界的边。 求有源汇上下界可行流即可。 具体做法可以从汇点向源点连容量为正无穷的边,转成无源汇上下界可行流。 然后可以新建超级源汇,对于一条下界为l,上界为r的边(x,y),从超级源点向y,x向超级汇点连容量为l的边,x向...

weixin_30872867的博客 282

演化计算(蚁群算法、粒子群算法、遗传算法、演化规则......)

演化算法1.概念2.解决的问题 1.概念 传统算法(如梯度下降法、爬山法)根据导数的性质决定迭代的方向;而演化计算是一组解在一起协同作用产生一个最优解。 2.解决的问题 预测优化:演化计算(蚁群算法、粒子群算法、遗传算法等) 解的聚散、多样性:通过多次聚散,尽快得出最优解(某个解不合要求,要能够发散出去) ...

dear_jing的博客 4162

二十一、CANdelaStudio深入-SPRMIB的配置

本专栏将由浅入深的展开诊断实际开发与测试的数据库编辑,包含大量实际开发过程中的步骤、使用技巧与少量对Autosar标准的解读。希望能对大家有所帮助,与大家共同成长,早日成为一名车载诊断、通信全栈工程师。 本文介绍CANdelaStudio的肯定响应抑制位配置,欢迎各位朋友订阅、评论,可以提出宝贵意见,以持续输出更好的作品,同时会根据评论、私信不定期更新文章内容,以及专栏目录。订阅该专栏的朋友可私信小编免费答疑解惑(^U^)ノ~YO CANdelaStudio-从入门到深入目录 文章目录CANdelaStu

诊断协议那些事儿's blog 1870

POJ2396&ZOJ1994--Budget【有源汇上下界可行流】

链接:http://poj.org/problem?id=2396 题意:给一个n*m的矩阵,给出每行的总和以及每列的总和,再给出某些位置的最小或最大限制,问是否存在可能的矩阵,如果存在输出一种矩阵信息。 思路:这是一个有源汇的上下界可行流,对于这种题,从汇点连一条弧到源点,容量为INF,这不会影响流量平衡条件,并且此时原图转换为了无源汇的上下界可行流,剩下的做法和无源汇一样。 建图

阳光照耀圣西罗 1034

【CC精品教程】iTwin capture倾斜摄影建模完整操作流程

【CC精品教程】iTwin capture倾斜摄影建模完整操作流程。包括:无人机航测外业作业流程(像控点布设、航线规划、仿地飞行、航拍)和内业数据处理软件(Pix4d、CC、EPS、PhotoScan、Globalmapper)像控点权重调配、空三加密、DOM、DSM、DEM,DLG生成、等高线生成、高程点提取,点云分类过滤分割、点云生成DEM、三维模型生成等。

智慧空间实验室 3959

POJ2396 Budget [有源汇上下界可行流]

POJ2396 Budget 题意:n*m的非负整数矩阵,给出每行每列的和,以及一些约束关系x,y,&gt;=&lt;,val,表示格子(x,y)的值与val的关系,0代表整行/列都有这个关系,求判断是否有解并求一组解 建图显然 \[s \rightarrow _{[行和,行和]} x \rightarrow _{格子(x,y)的限制[l,r]} y \rightarrow_{[列和,列和]} ...

weixin_34087307的博客 157

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

POJ 2396 - Budget 有源汇的上下界可行流

<br />POJ 2396 - Budget 有源汇的上下界可行流转自http://hi.baidu.com/zfy0701/blog/item/6449d82a64e15e3e5343c1ba.html<br />http://acm.pku.edu.cn/JudgeOnline/problem?id=2396<br />题目的大意是:给定一个矩阵每行,每列的和,和各个元素的限制条件(>, =, <),求出一个满足这各种限制的矩阵。<br />这个模型很类似与经典的矩阵取整模型。<br /><br />

hqd_acm的专栏 887

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

poj 2396 Budget(有源汇上下界可行流)

Budget Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 5621   Accepted: 2140   Special Judge Description We are supposed to make a budget proposal for this m

WEYuLi的专栏 890

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【poj2396】Budget 有源汇上下界可行流

DescriptionWe are supposed to make a budget proposal for this multi-site competition. The budget proposal is a matrix where the rows represent different kinds of expenses and the columns represent diff

DQS的树洞 929

POJ2396:Budget 有源汇上下界可行流

好久没A的这么舒畅了。。第一次写居然1A辣。。Part2: 有源汇上下界可行流 有源汇上下界可行流就是在多了源点和汇点,这样导致除了源点和汇点外的其他店都流量守恒,我们可以从TT向SS连一条容量为无穷大的边,保证S,TS,T也流量守恒,然后就可以转化为无源汇上下界可行流做啦。 这题的建图很直观,行列建图,每行连源点,每列连汇点,上下界均为sumisum_i,然后关于点(i,j)(i,j)的操作

ws_fqk 565

POJ ~ 2396 ~ Budget (有源汇上下界可行流)

题意 T组测试数据,给你一个n*m的矩阵,输入每一行的和,每一列的和,在输入一些形如x y &gt; z限制条件,如果x为0表示所有行,y为0表示所有列,x==0,y==0表示整个矩阵。求是否村子满足要求的矩阵,存在就输出矩阵。   思路 转化为有源汇上下界可行流来做。 行列看作点,行为Xi,列为Yi,建立源点s,汇点t。 ①源点向行Xi建边,上下界均为行和 ②列Yi向汇点Yi建边,...

张松超的博客 331

poj2396 Budget(有源汇的有上下界的可行流)

有源汇的有上下界的可行流,加一条边t->s,容量为(0,inf)即可转化为无源汇的有上下界的可行流。

Icefox的博客 527

[POJ2396]Budget(有源汇有上下界的可行流+讲解)

我可以去冬眠了?

薇小薇 511

poj 2396 Budget--有源汇+有上下界+可行流

/* 有源汇 有上下界 求可行流 有源汇可以转化为无源汇:添加一条边t~s (0,0x7fffffff) 就成了无源汇 基本流程是: 构造附加网络(添加新源 新汇 分离必要弧) 求附加网络的最大流 若新源 新汇 相邻的边都是满流,则存在可行流 题意: 有个表格,给出每行的和以及每列的和 还有某些元素的要求 求一个符合条件的表格 一个比较详细的讲解 http://blog.csdn.n

1130

POJ 2396 Budget 有源汇有上下界的可行流

题目:http://poj.org/problem?id=2396 题意:假定有一个n * m的数字矩阵,现在给出矩阵的每一行的和与每一列的和,且给出了一些矩阵中元素需要满足的条件,即某个元素应该在某个范围内,问有没有满足条件的矩阵,若有输出这个矩阵 思路:有源汇有上下界的可行流。记录每个元素的最大下界,最小上界,元素就在这个范围内,没被限制的就是无穷大。从源点向每一行连边,容量为每一行的和,

弱智就要多努力 353

[POJ2396]Budget(有源汇有上下界的可行流)

题目描述传送门题解和无源汇有上下界的可行流类似,只需要加一条边t->s,限制为[0,inf]就可以了,相当于是让源点和汇点也满足流量平衡 然后再建立附加源汇ss,tt,其余的就和无源汇的一样了这道题的话,把每一行看成一个点xi,每一列看成一个点yi,那么首先s->xi,[sumxi,sumxi],yi->t,[sumyi,sumyi] 对于某一个点(i,j)的限制[l,r],xi->yj,[l,

zyf2000 527

【POJ2396】Budget(有源汇的上下界可行流)

题意:要求构建一个m*n的矩阵,给出每行,每列的和,和C个要求:表示某个坐标的数必须严格”&gt;”或”=”或”&lt;”某个值,0是通配符,表示一整行(列)。 建图: 源点-&gt;横排 (该横排的和) 横排-&gt;该横排的点 (按C个要求给权值,分上界下界) 该横排的点-&gt;竖排(按C个要求给权值,分上界下界) 竖排-&gt;汇点(该竖排的和) 这就成了有源汇的可行流问题(不...

CaptainChen的博客 561

【有源汇有上下界可行流】POJ-2396(ZOJ-1994) Budget

Budget Time Limit: 3000MS   Memory Limit: 62M         Special Judge Description We are supposed to make a budget proposal for this multi-site competition. The budget pr

JSure的代码库 899
上一篇: sgu 176 Flow construction (有汇源有上下界的最小流)
下一篇: POJ 3422 Kaka's Matrix Travels (最小费用最大流)
SIO__Five
博客等级 码龄14年 29粉丝 225原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值