bzoj 4500 矩阵 题解
题意:
有一个 $ n * m $ 的矩阵,初始每个格子的权值都为 $ 0 $,可以对矩阵执行两种操作:
- 选择一行,该行每个格子的权值加1或减1。
- 选择一列,该列每个格子的权值加1或减1。
现在有 $ K $ 个限制,每个限制为一个三元组 $ (x,y,c) $ ,代表格子$ (x,y) $ 权值等于 $ c $ 。问是否存在一个操作序列,使得操作完后的矩阵满足所有的限制。如果存在出” $ Yes $ ”,否则输出” $ No $ ”。
这道题是个一个查分约束题,它给出 $ K $ 个条件要求即$ (x,y) $ 的权值为 $ c $ 我们可以看作 $ x $ 行的变换量 $ add[x] $ ,与第 $ y $ 列的变化量 $ add[y] $ 的和等于 $ c $ ,由于我们设置的是变化量所以是正还是负就无所谓~,所以我们可以写出 $ add[x]+add[y]=c $
等价于 $ add[y]-(-add[x])=c $
等价于 $ add[y]-(-add[x]) \geq c $ && $ add[y]-(-add[x]) \leq c $
等价于 $ add[y]-add[x]^ \geq c $ && $ add[x]^
-add[y] \geq -c $
然后就可以由 $ x->y $ 连一条长为 $ c $ 的边,由 $ y->x $ 连一条长为 $ -c $ 的边
由于列与行要区分,那么令列加上 $ n $ 即可
代码
#include<bits/stdc++.h>
using namespace std;
const int size=2010;
int head[size],Next[2*size],ver[2*size],edge[2*size],deg[size],tot;
int v[size],dis[size];
int n,m,k,T;
queue<int>q;
inline int read(){
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
void add(int x,int y,int z){
ver[++tot]=y;edge[tot]=z;Next[tot]=head[x];head[x]=tot;
}
bool spfa(){
while(q.size()) q.pop();
memset(v,0,sizeof(v));
memset(deg,0,sizeof(deg));
memset(dis,0x3f,sizeof(dis));
dis[0]=0;v[0]=1;q.push(0);
while(q.size()){
int x=q.front();q.pop();v[x]=0;
if(deg[x]==n+m-1) return 0;
deg[x]++;
for(int i=head[x];i;i=Next[i]){
int y=ver[i];
if(dis[y]>dis[x]+edge[i]){
dis[y]=dis[x]+edge[i];
if(!v[y]){
v[y]=1;
q.push(y);
}
}
}
}
return 1;
}
int main(){
scanf("%d",&T);
while(T--){
memset(head,0,sizeof(head));tot=0;
n=read();m=read();k=read();
for(int i=1;i<=k;++i){
int x,y,z;
x=read();y=read();z=read();
add(x,y+n,z);
add(y+n,x,-z);
}
for(int i=1;i<=n+m;++i){
add(0,i,0);
}
if(spfa()) printf("Yes\n");
else printf("No\n");
}
return 0;
}
bzoj 4500 矩阵 题解的更多相关文章
- BZOJ 4500: 矩阵
4500: 矩阵 Time Limit: 1 Sec Memory Limit: 256 MBSubmit: 326 Solved: 182[Submit][Status][Discuss] De ...
- BZOJ 4500: 矩阵 差分约束
题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=4500 题解: 从行向列建边,代表一个格子a[i][j],对每个顶点的所有操作可以合并在一 ...
- 【BZOJ 4500 矩阵】
Time Limit: 1 Sec Memory Limit: 256 MBSubmit: 390 Solved: 217[Submit][Status][Discuss] Description ...
- bzoj 4500: 矩阵 差分约束系统
题目: Description 有一个n*m的矩阵,初始每个格子的权值都为0,可以对矩阵执行两种操作: 选择一行, 该行每个格子的权值加1或减1. 选择一列, 该列每个格子的权值加1或减1. 现在有K ...
- BZOJ.4500.矩阵(差分约束 SPFA判负环 / 带权并查集)
BZOJ 差分约束: 我是谁,差分约束是啥,这是哪 太真实了= = 插个广告:这里有差分约束详解. 记\(r_i\)为第\(i\)行整体加了多少的权值,\(c_i\)为第\(i\)列整体加了多少权值, ...
- bzoj 4500: 矩阵【差分约束】
(x,y,z)表示格子(x,y)的值为z,也就是x行+y列加的次数等于z,相当于差分约束的条件,用dfs判断冲突即可. #include<iostream> #include<cst ...
- BZOJ 4500: 矩阵 带权并查集
这个思路挺巧妙的 ~ 定义一行/列的权值为操作后所整体增加的值. 那么,我们会有若干个 $a[x]+b[y]=c$ 的限制条件. 但是呢,我们发现符号是不能限制我们的(因为可加可减) 所以可以将限制条 ...
- BZOJ 1179 Atm 题解
BZOJ 1179 Atm 题解 SPFA Algorithm Tarjan Algorithm Description Input 第一行包含两个整数N.M.N表示路口的个数,M表示道路条数.接下来 ...
- Wannafly挑战赛13 zzf的好矩阵 题解 答案解释
Wannafly挑战赛13 zzf的好矩阵 题解 文章目录 Wannafly挑战赛13 zzf的好矩阵 题解 分析 结论1 结论2 结论3 C数组对应带子说明 空白长度论述 后续黑色长度论述 能&qu ...
随机推荐
- 动手动脑---找出指定文件夹下所有包容指定字符串的txt文件
思路:先判断是否为文件,如果是文件,则需要判断改文件名是否包含字符串"txt",包含则输出.如果是文件夹的话,先需要判断文件名是否包含".txt"(因为文件名也 ...
- redash oracle 数据源docker 镜像
redash 官方的docker 镜像是没有包含oracle的,需要我们自己添加,参考了一个docker 镜像进行了简单的修改 Dockerfile FROM redash/redash:7.0.0. ...
- callbag js callback 标准-支持轻量级观测以及迭代
callbag 是一个js 的回调标准,方便开发支持观测以及迭代的代码 类似已经有好多的实现了 callbag-basics 比rxjs 以及xstream 还快 wonka 说明 基于标准的开发,对 ...
- 干货 | 10分钟掌握branch and cut(分支剪界)算法原理附带C++求解TSP问题代码
00 前言 branch and cut其实还是和branch and bound脱离不了干系的.所以,在开始本节的学习之前,请大家还是要务必掌握branch and bound算法的原理. 01 应 ...
- mysql 创建主键,修改主键
//添加一个字段pid并且设置为主键(auto_increment)自增(auto_increment),不可为null,类型为int unsigned alter table table1 add ...
- ICEM-哑铃
原视频下载地址:https://pan.baidu.com/s/1kVBKJbT ;密码: jqeh
- CentOS7 通过systemd 添加开机重启服务
现在越来越多的环境采用 CentOS 7 作为基础配置,特别是 Hadoop生态 如果要测试或部署环境需要启动很多组件(zookeeper.kafka.redis等等),如下内容是在操作系统层实现开机 ...
- 【2019】Charles视频教程,接口测试工具最新教程
Charles 是在 windows/mac/linux下常用的网络封包截取工具,也是电商/直播/搜索/金融/H5/App等测试专用接口测试工具. Charles 支持Http/Https/Webso ...
- md5加密后不能解密
MD5加密原理是散列算法,散列算法也称哈希算法.计算机专业学的数据结构就有哈希表这一知识点.比如10除以3余数为一,4除以3余数也为一,但余数为一的就不知道这个数是哪个了.所以md5不能解密.就算是设 ...
- linux core 性能
apt-get install lrzsz apt-get install vim apt-get install -y net-tools apt-get install -y procps htt ...