题目:

Description

有一个n*m的矩阵,初始每个格子的权值都为0,可以对矩阵执行两种操作:

  1. 选择一行, 该行每个格子的权值加1或减1。
  2. 选择一列, 该列每个格子的权值加1或减1。

    现在有K个限制,每个限制为一个三元组(x,y,c),代表格子(x,y)权值等于c。

    问是否存在一个操作序列,使得操作完后的矩阵满足所有的限制。如果存在输出”Yes”,否则输出”No”。

题解:

如果我们将所有的行作为变量\(x\),所有的列作为变量\(y\).

变量本身代表对这行(列)进行的操作数(x,y可以为负)

所以对于每一个三元限制我们可以列出方程\(x_i + y_i = c_i\)

然后我们移项得到\(x_i - c_i = y_i\)

这样我们可以依据这个等式列出两个不等式:

  • $ x_i - c_i \leq y_i $
  • $ y_i - (-c_i) \leq x_i $

然后我们建立差分约束系统,dfs判正环即可.

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
inline void read(int &x){
x=0;char ch;bool flag = false;
while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;
while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;
}
const int maxn = 2048;
const int maxm = 1024*1024;
struct Edge{
int to,next,dis;
}G[maxm];
int head[maxn],cnt;
void add(int u,int v,int d){
G[++cnt].to = v;
G[cnt].next = head[u];
head[u] = cnt;
G[cnt].dis = d;
}
int dis[maxn];bool inq[maxn];
inline void init(){
memset(head,0,sizeof head);
memset(dis,-0x3f,sizeof dis);
memset(inq,false,sizeof inq);
cnt = 0;
}
#define v G[i].to
bool dfs(int u){
inq[u] = true;
for(int i = head[u];i;i=G[i].next){
if(dis[v] < dis[u] + G[i].dis){
dis[v] = dis[u] + G[i].dis;
if(inq[v]) return false;
if(!dfs(v)) return false;
}
}
inq[u] = false;
return true;
}
#undef v
int x[maxn],y[maxn],c[maxn];
int work(){
init();
int n,m,k;read(n);read(m);read(k);
for(int i=1;i<=k;++i) read(x[i]),read(y[i]),read(c[i]);
for(int i=1;i<=k;++i){
for(int j=1;j<=k;++j){
if(x[i] == x[j] && y[i] == y[j] && c[i] != c[j]) return puts("No");
if(x[i] == x[j] && y[i] == y[j]) continue;
if(x[i] == x[j] && c[i] - c[j] >= 0){
add(y[j]+n,y[i]+n,c[i]-c[j]);
add(y[i]+n,y[j]+n,c[j]-c[i]);
}
if(y[i] == y[j] && c[i] - c[j] >= 0){
add(x[j],x[i],c[i]-c[j]);
add(x[i],x[j],c[j]-c[i]);
}
}
}
for(int i=1;i<=n+m;++i) if(!dfs(i)) return puts("No");
return puts("Yes");
}
int main(){
int T;read(T);
while(T--) work();
getchar();getchar();
return 0;
}

bzoj 4500: 矩阵 差分约束系统的更多相关文章

  1. BZOJ 4500: 矩阵 差分约束

    题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=4500 题解: 从行向列建边,代表一个格子a[i][j],对每个顶点的所有操作可以合并在一 ...

  2. BZOJ.4500.矩阵(差分约束 SPFA判负环 / 带权并查集)

    BZOJ 差分约束: 我是谁,差分约束是啥,这是哪 太真实了= = 插个广告:这里有差分约束详解. 记\(r_i\)为第\(i\)行整体加了多少的权值,\(c_i\)为第\(i\)列整体加了多少权值, ...

  3. BZOJ 4500: 矩阵

    4500: 矩阵 Time Limit: 1 Sec  Memory Limit: 256 MBSubmit: 326  Solved: 182[Submit][Status][Discuss] De ...

  4. bzoj 4500: 矩阵【差分约束】

    (x,y,z)表示格子(x,y)的值为z,也就是x行+y列加的次数等于z,相当于差分约束的条件,用dfs判断冲突即可. #include<iostream> #include<cst ...

  5. 【BZOJ 4500 矩阵】

    Time Limit: 1 Sec  Memory Limit: 256 MBSubmit: 390  Solved: 217[Submit][Status][Discuss] Description ...

  6. bzoj 4500 矩阵 题解

    题意: 有一个 $ n * m $ 的矩阵,初始每个格子的权值都为 $ 0 $,可以对矩阵执行两种操作: 选择一行,该行每个格子的权值加1或减1. 选择一列,该列每个格子的权值加1或减1. 现在有 $ ...

  7. BZOJ 4500: 矩阵 带权并查集

    这个思路挺巧妙的 ~ 定义一行/列的权值为操作后所整体增加的值. 那么,我们会有若干个 $a[x]+b[y]=c$ 的限制条件. 但是呢,我们发现符号是不能限制我们的(因为可加可减) 所以可以将限制条 ...

  8. BZOJ 2330: [SCOI2011]糖果 [差分约束系统] 【学习笔记】

    2330: [SCOI2011]糖果 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 5395  Solved: 1750[Submit][Status ...

  9. bzoj 2330 [SCOI2011]糖果(差分约束系统)

    2330: [SCOI2011]糖果 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3574  Solved: 1077[Submit][Status ...

随机推荐

  1. Root(hdu5777+扩展欧几里得+原根)

    Root                                                                          Time Limit: 30000/1500 ...

  2. Office 365系列(二) -一些比较容易混淆的概念

    上一篇比较简明地说了Office 365怎么注册使用,在继续探讨之前先讨论一些比较容易混淆的概念! 1. Office 365:  是微软云计划的一部分包括Exchange online, Lync ...

  3. 转载一篇将C/C++ 与lua混合使用入门讲的比较好的文章

    转自 http://www.open-open.com/home/space-6246-do-blog-id-1426.html Lua是一个嵌入式的脚本语言,它不仅可以单独使用还能与其它语言混合调用 ...

  4. 洛谷 P2051 [AHOI2009]中国象棋

    题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法.大家肯定很清楚,在中国象棋中炮的行走方式是 ...

  5. zip filter map 列表生成器

    map map(function, list): 就是对list 中的每一个元素都调用function函数进行处理,返回一个map的对象 list一下就可以生成一个列表 或者for循环该对象就可以输出 ...

  6. centos install docker setup centos7 安装docker

    centos7 安装docker 1: 安装必要的一些系统工具sudo yum install -y yum-utils device-mapper-persistent-data lvm2 2: 添 ...

  7. python基础13 ---函数模块3(正则表达式)

    正则表达式 一.正则表达式的本质 1.正则表达式的本质(或 RE)是一种小型的.高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现.正则表达式模式被编译成一系列的 ...

  8. shell基础part2

    shell基础 一.bash中的变量 1.变量的定义:变量是计算机的内存单元,其中存放的值是可以改变的. 2.变量的设定规则:变量名不能以数字开头:变量的等号两边不能有空格,变量的值如果想有空格必须用 ...

  9. Java基础教程:多线程基础(1)——基础操作

    Java:多线程基础(1) 实现多线程的两种方式 1.继承Thread类 public class myThread extends Thread { /** * 继承Thread类,重写RUN方法. ...

  10. 牛客小白月赛1 G あなたの蛙は旅⽴っています【DP】

    题目链接 https://www.nowcoder.com/acm/contest/85/G 思路 按照题解上的方式 存取数据 然后DP一下 就可以了 AC代码 #include <cstdio ...