题解【[FJOI2018]所罗门王的宝藏】
本题解同步于luogu
emmm切了近年省选题来写题解啦qwq
该题较其他省选题较水吧(否则我再怎么做的出来
思路是图论做法,做法上楼上大佬已经讲的很清楚了,我来谈谈代码实现上的一些细节
\]
\]
\]
\]
\]
\]
\]
\]
时间复杂度为$$O(T\times(KlogK+K)) = O(TNlogN)$$要改进也行,因为我们对于每个点所连边只要边权最小数所以没必要sort,但当我想到这一点时已经AC本题~
\]
#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
#include<cstring>
#define MAXN 1005
using namespace std ;
inline void read(int &x) {
scanf("%d",&x) ;
}
class getsol {
public:
//========data========
vector<pair<int,int> > edge[MAXN*2] ; //pair第一维是边权,第二维是到达边的编号
int n , m , k , onk[MAXN*2] , inq[MAXN*2] , flag ;//inq表示是否被搜到
//========func========
void add(int x,int y,int v) {
edge[x].push_back(make_pair(v,y)) ; //加边
}
bool check(int u,int v,int w) {
//check , 判断v点是否可行
if(onk[u]+onk[v]!=w) return 0 ;
return 1 ;
}
void dfs(int D) {
//cout<<"DFS : START SEARCH IN DOT "<<D<<endl ;
if(flag==0) return ;
inq[D] = 1 ;
for(auto& i : edge[D]) { //对于每个edge[D]中的元素i
///cout<<"DFS : SEARCH IN DOT "<<i.second<<endl ;
if(flag==0) return ;
//cout<<"In dot : "<<i.second<<endl ;
int ver = i.second , edgeval = i.first ;
if(inq[ver]) {
if(flag==1) //如果答案还是"Yes"那么更新,这里是一个优化~
flag = check(D,ver,edgeval) ;
continue ;
} else {
onk[ver] = edgeval-onk[D] ;
dfs(ver) ;
}
}
}
void PRINT(int* arr,int n) {
for(int i=1; i<=n; ++i) {
cout<<"arr["<<i<<"] = "<<arr[i]<<endl ;
}
}
void sol() {
flag = true ;
read(n) , read(m) , read(k) ;
//行的编号为1~n
//列的编号为(n+1)~(2*n)
//喵~
for(int i=1; i<=k; ++i) {
int x,y,v ;
read(x) , read(y) , read(v) ;
add(x,y+n,v) ;
add(y+n,x,v) ;
}
//cerr<<"FINISH READ"<<endl ;
for(int i=1; i<=2*n; ++i) sort(edge[i].begin(),edge[i].end()) ;
//cerr<<"FINISH SORT"<<endl ;
for(int i=1; i<=2*n; ++i) {
if(!inq[i]&&flag&&!edge[i].empty()) { // 注意这里判一下vector是否为空。。因为这个RE了两三次
onk[i] = (*edge[i].begin()).first ;
//cerr<<"SEARCH IN DOT "<<i<<endl ;
dfs(i) ;
}
}
if(flag==1) {
for(int i=1; i<=2*n; ++i)
for(auto& j : edge[i])
if(flag==1) //重新check一遍,以免遗漏
flag = check(i,j.second,j.first) ;
}
if(flag) puts("Yes") ;
else puts("No") ;
//PRINT(onk,2*n) ;
}
void clear() {
for(int i=1; i<=2*n; ++i) edge[i].clear() ;
memset(inq,0,sizeof(onk)) ;
memset(onk,0,sizeof(onk)) ;
n = m = k = flag = 0 ;
}
} ;
getsol M ;
int T ;
int main() {
//freopen("solo3.in" , "rb" , stdin) ;
//freopen("solo3.out", "wb" ,stdout) ;
read(T) ;
while(T--) M.sol() , M.clear() ;
}
注意本代码是使用C++11标准写成,代码中不同不同语法处已标注
题解【[FJOI2018]所罗门王的宝藏】的更多相关文章
- 【BZOJ5470】[FJOI2018]所罗门王的宝藏()
[BZOJ5470][FJOI2018]所罗门王的宝藏() 题面 BZOJ 洛谷 有\(n+m\)个变量,给定\(k\)组限制,每次告诉你\(a_i+b_j=c_k\),问是否有可行解. 题解 一道很 ...
- bzoj5470 / P4578 [FJOI2018]所罗门王的宝藏
P4578 [FJOI2018]所罗门王的宝藏 设第$i$行上的值改变了$r1[i]$,第$j$列上的值改变了$r2[i]$ 显然密码$(i,j,c)=r1[i]+r2[j]$ 对于同一列上的两个密码 ...
- 洛谷4578 & LOJ2520:[FJOI2018]所罗门王的宝藏——题解
https://www.luogu.org/problemnew/show/P4578 https://loj.ac/problem/2520 有点水的. 先转换成图论模型,即每个绿宝石,横坐标向纵坐 ...
- 洛谷P4578 [FJOI2018]所罗门王的宝藏(dfs)
题意 题目链接 Sol 对于每个询问\(x, y, c\) 从在\((x, y)\)之间连一条边权为\(c\)的双向边,然后就是解\(K\)个二元方程. 随便带个数进去找找环就行了 #include& ...
- P4578 [FJOI2018]所罗门王的宝藏
传送门 考虑一个位置答案传递性,如果某个位置的红宝石转动确定了,那么会引起连锁反应: 如图,绿色的转动确定了,那么那两个蓝色的转动也确定了 自己手玩一下,发现如果有解那么随便找一个开始然后一路玩下去最 ...
- luoguP4578_ [FJOI2018]所罗门王的宝藏
题意 一个n*m的矩阵,初始值全为0,每一行每一列操作一次可以加1或者减1,问能否操作得到给定矩阵. 分析 行和列的分别的加减是可以相互抵消的,因此我们只需要考虑行的加和列的减. 对于给定矩阵每一个数 ...
- 【LOJ】 #2520. 「FJOI2018」所罗门王的宝藏
题解 发现似乎相当于问一个2000个元的方程组有没有解-- 然而我懵逼啊-- 发现当成图论,两个点之间连一条边,开始BFS,每个点的值赋成边权减另一个点的点权 如果一个环不合法那么肯定无解 代码 #i ...
- 【题解】P3959 宝藏 - 状压dp / dfs剪枝
P3959 宝藏 题目描述 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 n 个深埋在地下的宝藏屋, 也给出了这 n 个宝藏屋之间可供开发的m 条道路和它们的长度. 小明决心亲自前往挖掘所有宝 ...
- 题解-FJOI2018 领导集团问题
题面 FJOI2018 领导集团问题 给一棵树 \(T(|T|=n)\),每个点有个权值 \(w_i\),从中选出一个子点集 \(P=\{x\in {\rm node}|x\in T\}\),使得 \ ...
随机推荐
- P1052 卖个萌
P1052 卖个萌 转跳点:
- 如何修改 Vmware vRealize Operations Manager Appliance root密码
开机后,按上下键,选择 中间那一项,在底部增加:init=/bin/bash 进入单用户模式后,输入命令:# passwd root #修改root密码,要输 ...
- eclipse 安装spring tools suite插件
之前使用idea进行springboot项目的开发学习,但是由于idea是收费的,总是用着用着说验证码到期之类的,总之还是很不爽,于是就想重新采用eclipse开发springboot项目,为了方便s ...
- 2.15 使用web 编写一个简单记事本
首先陈列问题 (等待解决): 1. 界面是使用 H5 iframe 标签合并而成的,当窗口化之后点击任务栏,显示的内容会在任务栏的下边 希望可以找其他方式替代 (其他方法不熟练,不能应用) 如图 ...
- JavaScript的函数和对象介绍
一.JavaScript中的函数 1.函数的概述 JavaScript中的函数是一段可执行代码的合集,在需要执行的时候可以在方法名之后添加一对小括号执行方法.是一段可执行的字符串. 2.函数中隐藏的属 ...
- Bulma CSS - 模块化
Bulma CSS框架教程 Bulma CSS – 简介 Bulma CSS – 开始 Bulma CSS – CSS类 Bulma CSS – 模块化 Bulma CSS – 响应式 Bulma框架 ...
- ProxyPass与ProxyPassReverse及ProxyPassMatch的概述
转载自:https://blog.csdn.net/xiaokui_wingfly/article/details/51481653 apache中的mod_proxy模块主要作用就是进行url的转发 ...
- 尝试用kotlin做一个app(五)
JSP后台管理系统 开发工具是IntelliJ IDEA+tomcat+mysql5.6.19+mysql-connector-java-5.1.48.jar+easyui+kindeditor 之前 ...
- 编程入门-Eclipse项目导出和导入
编程入门-Eclipse项目导出和导入 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.导出项目 1>.如下图所示,在项目目录上右击鼠标,依次点击"Export& ...
- UVA - 10689 Yet another Number Sequence (矩阵快速幂求斐波那契)
题意:已知f(0) = a,f(1) = b,f(n) = f(n − 1) + f(n − 2), n > 1,求f(n)的后m位数. 分析:n最大为109,矩阵快速幂求解,复杂度log2(1 ...