专栏首页数据结构与算法洛谷P4578 [FJOI2018]所罗门王的宝藏(dfs)

洛谷P4578 [FJOI2018]所罗门王的宝藏(dfs)

题意

题目链接

Sol

对于每个询问x, y, c

从在(x, y)之间连一条边权为c的双向边,然后就是解K个二元方程。

随便带个数进去找找环就行了

#include<bits/stdc++.h>
#define LL long long 
#define fi first
#define se second
#define Pair pair<int, int> 
#define Fin(x) freopen(#x".in", "r", stdin);
using namespace std;
const int MAXN = 3001, INF = 1e9 + 10;
template<typename A, typename B> inline bool chmax(A &x, B y) {return x < y ? x = y, 1 : 0;}
template<typename A, typename B> inline bool chmin(A &x, B y) {return x > y ? x = y, 1 : 0;}
inline int read() {
    char c = getchar(); int x = 0, f = 1;
    while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
    while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
    return x * f;
}
int N, M, val[MAXN], vis[MAXN];
vector<Pair> v[MAXN];
int dfs(int x) {
    vis[x] = 1;
    for(auto &to : v[x]) {
        if(vis[to.fi] && val[x] + val[to.fi] != to.se) return 0;
        else if(vis[to.fi]) continue;
        val[to.fi] = to.se - val[x];
        if(!dfs(to.fi)) return 0;
    }
    return 1;
}
void solve() {
    memset(val, 0, sizeof(val));
    memset(vis, 0, sizeof(vis));
    int N = read(), M = read(), K = read();
    for(int i = 1; i <= N + M; i++) v[i].clear();
    for(int i = 1; i <= K; i++) {
        int x = read(), y = read(), c = read();
        v[x].push_back({y + N, c});
        v[y + N].push_back({x, c});
    }
    for(int i = 1; i <= N + M; i++) 
        if(!vis[i] && !dfs(i)) 
            {puts("No"); return ;}
    puts("Yes");
}
signed main() {
//  Fin(a);
    for(int T = read(); T--; solve());
    return 0;
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 洛谷P2827 蚯蚓(单调队列)

    有$m$个时间,每个时间点找出长度最大的蚯蚓,把它切成两段,分别为$a[i] * p$和$a[i] - a[i] * p$,除这两段外其他的长度都加一个定值$q...

    attack
  • BZOJ2683: 简单题(cdq分治 树状数组)

    你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要维护两种操作:

    attack
  • P1120 小木棍 [数据加强版]

    题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50。 现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍...

    attack
  • LeetCode 306. Additive Number

    ShenduCC
  • JAVA描述算法和数据结构(01):稀疏数组和二维数组转换

    在矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵;与之相反,若非0元素数目占大多数时,则称该矩阵为稠密矩阵...

    知了一笑
  • 2018年8月29日学习mysql数据库的笔记

    今天遇到的新单词: manual n手工的 correspond v符合一致 reject v拒绝 exist  v存在 solid adj固体的 ...

    武军超
  • 【HBUOJ】阿生的小球

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    韩旭051
  • C语言算法设计之奇数魔方阵

    将1到n(为奇数)的数字排列在nxn的方阵上,且各行、各列与各对角线的和必须相同,如下所 示:

    诸葛青云
  • MySQL中数值类型中smallint、mediumint等区别是什么

    数值类型中又可以分为整型、浮点型,或者可以说为严格数值数据类型以及近似数值数据类型

    沈唁
  • 管道符和作业控制,shell变量和环境变量配置文件

    叶瑾

扫码关注云+社区

领取腾讯云代金券