BZOJ 4500: 矩阵 差分约束

题目链接:

http://www.lydsy.com/JudgeOnline/problem.php?id=4500

题解:

从行向列建边,代表一个格子a[i][j],对每个顶点的所有操作可以合并在一起用sum[xi]表示,

那么题目相当于是要求sum[xi]+sum[xj]==a[xi][xj];

等价于:sum[xj]-(-sum[xi])==a[xi][xj]

等价于:sum[xj]-sum‘[xi]<=a[xi][xj] && sum[xj]-sum‘[xi]>=a[xi][xj]

等价于:sum[xj]<=sum‘[xi]+w && sum‘[xi]<=sum[xj]+(-w)

所有就可以用差分约束来做了。跑一遍最短路,判一下负环就可以了。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;

const int maxn = 2222;
const int INF = 0x3f3f3f3f;

struct Edge {
    int v, w;
    Edge(int v, int w) :v(v), w(w) {}
    Edge() {}
};

int n, m,k;
vector<Edge> egs;
vector<int> G[maxn];

void addEdge(int u, int v, int w) {
    G[u].push_back(egs.size());
    egs.push_back(Edge(v,w));
}

bool inq[maxn];
int cnt[maxn];
int d[maxn];
bool spfa() {
    memset(inq, 0, sizeof(inq));
    memset(cnt, 0, sizeof(cnt));
    for (int i = 0; i <= n + m; i++) d[i] = INF;
    queue<int> Q;
    d[0] = 0; inq[0] = true; Q.push(0);
    while (!Q.empty()) {
        int u = Q.front(); Q.pop();
        inq[u] = false;
        for (int i = 0; i < G[u].size(); i++) {
            Edge& e = egs[G[u][i]];
            if (d[e.v] > d[u] + e.w) {
                d[e.v] = d[u] + e.w;
                if (!inq[e.v]) {
                    Q.push(e.v);
                    inq[e.v] = true;
                    if (++cnt[e.v] > n+m+1) {
                        return false;
                    }
                }
            }
        }
    }
    return true;
}

void init() {
    for (int i = 0; i <= n + m; i++) G[i].clear();
    egs.clear();
}

int main() {
    int tc;
    scanf("%d", &tc);
    while (tc--) {
        scanf("%d%d%d", &n, &m, &k);
        init();
        for (int i = 0; i < k; i++) {
            int u, v, w;
            scanf("%d%d%d", &u, &v, &w);
            addEdge(u, v+n, w);
            addEdge(v+n, u, -w);
        }
        for (int i = 1; i <= n + m; i++) {
            addEdge(0, i, 0);
        }
        if (spfa()) {
            puts("Yes");
        }
        else {
            puts("No");
        }
    }
    return 0;
}

/*
2
2 2 4
1 1 0
1 2 0
2 1 2
2 2 2
2 2 4
1 1 0
1 2 0
2 1 2
2 2 1
*/
时间: 2024-08-24 16:23:39

BZOJ 4500: 矩阵 差分约束的相关文章

bzoj 4500: 矩阵【差分约束】

(x,y,z)表示格子(x,y)的值为z,也就是x行+y列加的次数等于z,相当于差分约束的条件,用dfs判断冲突即可. #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int N=2005; int T,n,m,k,cnt,p,h[N],va[N],f; bool v[N]; struct qwe { int ne,to,va; }e[N<<1]

【BZOJ 4500 矩阵】

Time Limit: 1 Sec  Memory Limit: 256 MBSubmit: 390  Solved: 217[Submit][Status][Discuss] Description 有一个n*m的矩阵,初始每个格子的权值都为0,可以对矩阵执行两种操作: 1. 选择一行, 该行每个格子的权值加1或减1. 2. 选择一列, 该列每个格子的权值加1或减1. 现在有K个限制,每个限制为一个三元组(x,y,c),代表格子(x,y)权值等于c.问是否存在一个操作序列,使得操作完后的矩阵满

bzoj 4500 矩阵 题解

题意: 有一个 $ n * m $ 的矩阵,初始每个格子的权值都为 $ 0 $,可以对矩阵执行两种操作: 选择一行,该行每个格子的权值加1或减1. 选择一列,该列每个格子的权值加1或减1. 现在有 $ K $ 个限制,每个限制为一个三元组 $ (x,y,c) $ ,代表格子$ (x,y) $ 权值等于 $ c $ .问是否存在一个操作序列,使得操作完后的矩阵满足所有的限制.如果存在出" $ Yes $ ",否则输出" $ No $ ". 这道题是个一个查分约束题,它

BZOJ 3436: 小K的农场 差分约束

题目链接: http://www.lydsy.com/JudgeOnline/problem.php?id=3436 题解: 裸的差分约束: 1.a>=b+c  ->  b<=a-c  ->  d[v]<=d[u]+w  ->  建一条边从a到b,权值为-c 2.a<=b+c  ->  d[v]<=d[u]+w  -> 建一条边从b到a,权值为c 3.a==b  ->  d[v]<=d[u]+0&&d[u]<=d

BZOJ 1202: [HNOI2005]狡猾的商人( 差分约束 )

好像很多人用并查集写的... 前缀和, 则 sumt - sums-1 = v, 拆成2条 : sumt ≤ sums-1 + v, sums-1 ≤ sumt - v 就是一个差分约束, 建图跑SPFA.. 想起之前codeVS某场月赛T1有些人用带权并查集..然而我是差分约束水过去的... ------------------------------------------------------------------------------ #include<cstdio> #incl

BZOJ 2330 [SCOI2011]糖果 差分约束spfa版

题意:自行百度,(之前做过一道candy的升级版). 方法:差分约束 解析:最近在学差分约束什么的,这道是做的第一个bz上的题,感觉还是较简单的.以下我对5种操作进行描述. case 转换不等式 转换不等式2 1 A>=0+B B>=0+A 2 B>=1+A 3 A>=0+B 4 A>=1+B 5 B>=0+A 如上表按照差分约束的原理加边,然后再观察上表不等式方向->为求大边,即最长路. 这些边是不够的,所有人应最少为1糖果,即创出个源点到各点距离为1. 后记:

HDU3666 差分约束

THE MATRIX PROBLEM Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 8418    Accepted Submission(s): 2179 Problem Description You have been given a matrix CN*M, each element E of CN*M is positive

【转载】夜深人静写算法(四)——差分约束

[转载]夜深人静写算法(四) - 差分约束  目录     一.引例       1.一类不等式组的解   二.最短路       1.Dijkstra       2.图的存储       3.链式前向星       4.Dijkstra + 优先队列       5.Bellman-Ford       6.SPFA       7.Floyd-Warshall   三.差分约束        1.数形结合        2.三角不等式        3.解的存在性        4.最大值

hdu 3666(差分约束,手动栈解决超时问题)

THE MATRIX PROBLEM Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 8016    Accepted Submission(s): 2092 Problem Description You have been given a matrix CN*M, each element E of CN*M is positive