大概是最后一篇题解,其实只是想颓废一下打个故事

据古代传说记载,所罗门王即是智慧的代表,又是财富的象征。他建立了强大而富有的国家,聚集了大批的黄金象牙和钻石,并把这些价值连城的珍宝藏在一个神秘的地方,这就是万世瞩目的“所罗门的宝藏”。多少个世纪以来,人们一直在寻找这批早已失落的古代文明宝藏,寻找盛产黄金和钻石的宝地。曾经追寻所罗门王宝藏的冒险者们都一去不回,至今没有人解开这个迷题。亨利男爵在一次幸运的旅行中以外地得到了三百年前一本葡萄牙贵族留下的写在羊皮卷上的所罗门王的宝藏图和一本寻宝秘笈。在这张藏宝图的诱惑下,亨利男爵邀请约翰上校和勇敢的猎象人夸特曼开始了寻找埋藏在黑暗地底的所罗门王宝藏的艰险历程。他们横穿渺无边际的沙漠和浓荫蔽日的原始森林,穿越汹涌澎湃的激流险滩,翻越高耸入云的峻岭雪山,饱尝沙漠的酷热和冰雪严寒,在藏宝图的指引下来到了非洲一个原始的神秘国度库库安纳。这里有残酷的人殉制度,有一个拥有一千个妻室的独眼暴君特瓦拉,有像兀鹫一般丑陋诡诈的老而不死的女巫加古尔,还有美丽聪明的绝代佳人弗拉塔。在这片陌生而又险象环生的土地上三位寻宝英雄历尽艰辛。终于在绝代佳人弗拉塔的帮助下在海底深处找到了珍藏这批价值连城宝藏的巨大藏宝洞。然而,在女巫加古尔的精心策划下,一场灭顶之灾正在悄悄逼近。

藏宝洞的洞门十分坚固且洞门紧闭,如果不知道开启洞门的秘密是无法打开藏宝洞的洞门的。在藏宝洞的洞门一侧有一个奇怪的矩形密码阵列。根据寻宝秘笈记载,在密码阵列的每行的左侧和每列的顶端有一颗红宝石按钮。每个按钮都可以向左或向右转动。每向左转动7一次按钮,相应的行或列重点数字都增加一。每次向右转动一次按钮,相应的行或列中的数字都减小一。在矩阵密码列阵的若干个位置镶嵌着绿宝石。只有当所有绿宝石位置的数字与藏宝图记载的密码完全相同,紧闭的洞门才会打开。女巫加古尔早已得知开门的秘密。为了阻止寻宝者打开洞门,女巫加古尔为开门的密码列阵设置了全零的初始状态。试图打开洞门的寻宝者如果不能迅速转动按钮使所有绿宝石上的数字与藏宝图记载的一样,就会启动藏宝洞玄妙的机关,使寻宝者遭到灭顶攻击而死于非命。

您能帮助三位寻宝者顺利打开藏宝洞的洞门吗?

编程任务:对于给出的密码阵列,找到获得正确密码的红宝石按钮转动序列。

输入格式

输入的第一行中有一个正整数T(T≤5) 表示有 T​ 组数据。每组数据的第一行有 ​3​个正整数​ n,m​和 ​k​,表示洞门密码阵列共有 n​行和 m 列,0<n,m,k ≤ 1000。各行从上到下依次编号为 1,2,……,n;各列从左到右依次编号为 1,2,……,m 。接下来的k 行中每行有三个整数 x,y,c,分别表示第 k 个绿宝石在密码阵列中的位置和密码,x 为行号 y 为列号,c为该位置处的密码。

输出格式

对于每组数据,用一行输出 Yes或者No。输出Yes表示存在获得正确密码的红宝石按钮的转动序列。输出 No则表示无法找到获得正确密码的红宝石按钮的转动序列。

输入输出样例

输入 #1

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

输出 #1

Yes
No

说明/提示

对于 100%的数据,1 ≤ n, m, k ≤ 1000,k ≤ n * m,∣c∣ ≤ 1000000。

Solution

对于每个绿宝石,将他的横纵坐标连边,则对于每个点加或者减就是相当于对所有相邻的边操作。对于每条边都有del[u] + del[v] == w

如果不满足上式,则不合法

满足的话就更新一下del[v]然后扔进队列去bfs

最后判断一下是不是每个点都合法就好了

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
using namespace std;
inline long long read() {
long long x = 0; int f = 0; char c = getchar();
while (c < '0' || c > '9') f |= c == '-', c = getchar();
while (c >= '0' && c <= '9') x = (x << 1) + (x << 3) + (c ^ 48), c = getchar();
return f ? -x : x;
} int n, m, k, cnt, hd[2005], del[2005];
struct szh {
int to, nxt, w;
}a[2005];
bool vis[2005];
queue<int> q;
inline void add(int x, int y, int z) {
a[++cnt].to = y, a[cnt].w = z, a[cnt].nxt = hd[x], hd[x] = cnt;
}
inline bool bfs(int s) {
while (!q.empty()) q.pop();
q.push(s); vis[s] = 1;
while (!q.empty()) {
int u = q.front(); q.pop();
for (int i = hd[u], v; v = a[i].to, i; i = a[i].nxt)
if (vis[v]) {
if (del[u] + del[v] != a[i].w) return 0;
}
else {
del[v] = a[i].w - del[u], vis[v] = 1;
q.push(v);
}
}
return 1;
}
int main() {
int T = read();
while (T--) {
memset(vis, 0, sizeof vis);
memset(hd, 0, sizeof hd);
cnt = 0;
n = read(); m = read(); k = read();
for (int i = 1, x, y, z; i <= k; ++i) {
x = read(); y = read(); z = read();
add(x, y + n, z); add(y + n, x, z);
}
bool ok = 1;
for (int i = 1; i <= n + m && ok; ++i)
if (!vis[i]) ok &= bfs(i);
if (ok) printf("Yes\n");
else printf("No\n");
}
return 0;
}

[FJOI2018]所罗门的宝藏的更多相关文章

  1. 【LOJ】 #2520. 「FJOI2018」所罗门王的宝藏

    题解 发现似乎相当于问一个2000个元的方程组有没有解-- 然而我懵逼啊-- 发现当成图论,两个点之间连一条边,开始BFS,每个点的值赋成边权减另一个点的点权 如果一个环不合法那么肯定无解 代码 #i ...

  2. 【BZOJ5470】[FJOI2018]所罗门王的宝藏()

    [BZOJ5470][FJOI2018]所罗门王的宝藏() 题面 BZOJ 洛谷 有\(n+m\)个变量,给定\(k\)组限制,每次告诉你\(a_i+b_j=c_k\),问是否有可行解. 题解 一道很 ...

  3. bzoj5470 / P4578 [FJOI2018]所罗门王的宝藏

    P4578 [FJOI2018]所罗门王的宝藏 设第$i$行上的值改变了$r1[i]$,第$j$列上的值改变了$r2[i]$ 显然密码$(i,j,c)=r1[i]+r2[j]$ 对于同一列上的两个密码 ...

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

    题意 题目链接 Sol 对于每个询问\(x, y, c\) 从在\((x, y)\)之间连一条边权为\(c\)的双向边,然后就是解\(K\)个二元方程. 随便带个数进去找找环就行了 #include& ...

  5. 洛谷4578 & LOJ2520:[FJOI2018]所罗门王的宝藏——题解

    https://www.luogu.org/problemnew/show/P4578 https://loj.ac/problem/2520 有点水的. 先转换成图论模型,即每个绿宝石,横坐标向纵坐 ...

  6. P4578 [FJOI2018]所罗门王的宝藏

    传送门 考虑一个位置答案传递性,如果某个位置的红宝石转动确定了,那么会引起连锁反应: 如图,绿色的转动确定了,那么那两个蓝色的转动也确定了 自己手玩一下,发现如果有解那么随便找一个开始然后一路玩下去最 ...

  7. luoguP4578_ [FJOI2018]所罗门王的宝藏

    题意 一个n*m的矩阵,初始值全为0,每一行每一列操作一次可以加1或者减1,问能否操作得到给定矩阵. 分析 行和列的分别的加减是可以相互抵消的,因此我们只需要考虑行的加和列的减. 对于给定矩阵每一个数 ...

  8. 题解【[FJOI2018]所罗门王的宝藏】

    本题解同步于luogu emmm切了近年省选题来写题解啦qwq 该题较其他省选题较水吧(否则我再怎么做的出来 思路是图论做法,做法上楼上大佬已经讲的很清楚了,我来谈谈代码实现上的一些细节 \[\tex ...

  9. 算法:poj1066 宝藏猎人问题。

    package practice; import java.util.Scanner; public class TreasureHunt { public static void main(Stri ...

随机推荐

  1. vertica单节点故障恢复 Startup Failed, ASR Required

    测试环境的vertica是单节点的,无法做到故障自动恢复,需要手工处理.案例如下: 发现5433端口连接不上,vertica挂了,手工运行admintools,重新启动vertica,仍然失败,提示: ...

  2. Android studio(AS) svg图片使用

    1.下载svg文件,https://www.iconfont.cn/阿里的2.通过AS - New - Vectro Asset转换成安卓可用的xml文件(ic_back.xml)3.配置Gradle ...

  3. Sitecore个性化 - 什么是历史个性化?

    顾名思义,Sitecore中的历史个性化允许您根据访问者过去在您网站上的行为来设置个性化规则. 许多组织选择Sitecore  作为其高级个性化功能的网站平台 - 历史个性化只是一种方法. 查看我们关 ...

  4. grafana的用户及权限的配置

    一.概述 在上几篇文章中,已经在grafana中,配置了几个Dashboard.需要给开发人员查看,但是我又不想让开发人员,随便更改Dashboard中的配置.需要创建一个只读账号才行. 二.添加用户 ...

  5. zbar android sdk在CentOS 7下的编译和使用

    环境:CentOS 7+NDK 20.0.5594570+libiconv-1.14 下载 下载libiconv-1.14版本,地址: https://ftp.gnu.org/pub/gnu/libi ...

  6. vue要求更新3.0-》使用axios的时候出现错误

    要求更新 使用axios报错 - Running completion hooks...error: 'options' is defined but never used (no-unused-va ...

  7. C#配置文件configSections详解

    一.问题需求: 在项目中经常遇到需要写配置文件地方,目的就是不想在程序中关于一些信息写死,发布的时候只需要修改一下配置文件就可以,不需要每次都修改程序,如项目名称.数据库连接字符串.IP端口之类 的: ...

  8. el-upload进度条无效,on-progress无效问题解决方案

    事先声明,本人系.net后端老菜鸟,vue接触没有多长时间,如果存在技术分享错误,切莫见怪,第一次写博,还请大佬们多多担待,转载请注明出处谢谢! 最近项目用到饿了么上传,于是参照官网接入el-uplo ...

  9. python 动态创建变量 获取变量名

    参考链接:https://www.cnblogs.com/technologylife/p/9211324.html 参考链接(未)(使用inspect 获取变量名):https://blog.csd ...

  10. navicat2059错误的解决

    1.输入mysql -uroot -p登陆mysql 2.登录成功以后使用ALTER USER 'root'@'localhost' IDENTIFIED BY 'password' PASSWORD ...