题解【[FJOI2018]所罗门王的宝藏】
本题解同步于luogu
emmm切了近年省选题来写题解啦qwq
该题较其他省选题较水吧(否则我再怎么做的出来
思路是图论做法,做法上楼上大佬已经讲的很清楚了,我来谈谈代码实现上的一些细节
\[\text{设节点1...2n,i}\in\text{1-n表示i行,i}\in\text{(n+1)-2n时表示i-n列}\]
\[\text{当我们读到一颗绿宝石(x,y,k)时,就从x向y+n连一条权值为k的边}\]
\[\text{当我们连完边后会发现给一行/一列增加a就相当于把与这个点相连的所有边权值增加a}\]
\[\text{这个加边权可以转化为加点权}\]
\[\text{设}onk_i\text{表示在这个节点上的点击次数,}\]
\[\text{搜索起始节点的初值为与这个节点所连边中权值最小的}\]
\[\text{那么已知两点i,j以及}edge_{i,j}\text{和}onk_i\text{,那么由题目条件易得}onk_j=edge_{i,j}-onk_i\]
\[\text{那么直接dfs}\]
时间复杂度为\[O(T\times(KlogK+K)) = O(TNlogN)\]要改进也行,因为我们对于每个点所连边只要边权最小数所以没必要sort,但当我想到这一点时已经AC本题~
\[Talk\;is\;free\;,\;show\;me\;the\;code\]
#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标准写成,代码中不同不同语法处已标注
转载于:https://www.cnblogs.com/tyqtyq/p/10387591.html
题解【[FJOI2018]所罗门王的宝藏】相关推荐
- 中国石油大学 个人训练赛第五场C:所罗门王的宝藏(高斯消元)
题目描述 据古代传说记载,所罗门王既是智慧的代表,又是财富的象征.他建立了强大而富有的国家,聚集了大批的黄金象牙和钻石,并把这些价值连城的珍宝藏在一个神秘的地方,这就是世人瞩目的"所罗门王的 ...
- 【BZOJ5470】【FJOI2018】—所罗门王的宝藏(BFS)
传送门 考虑每一颗绿宝石xxx向yyy连边,把一次加看做一个点的点值加 只需要看每个环上是否恒等,bfs即可 #include<bits/stdc++.h> using namespace ...
- yyb省选前的一些计划
突然意识到有一些题目的计划,才可以减少大量查水表或者找题目的时间. 所以我决定这样子处理. 按照这个链接慢慢做. 当然不可能只做省选题了. 需要适时候夹杂一些其他的题目. 比如\(agc/arc/cf ...
- 其他-私人♂收藏(比赛记录 Mar, 2019)
OwO 03.03 [USACO19JAN] A. Redistricting 题意:给 \(g\) ,求 \(f(n)\) . \(f(i)=f(j)+[g(i)\ge g(j)],j \in (i ...
- 华为手机里的“麦田守望者”
为了一个理由, 有人英勇地死去, 为了一个理由, 有人坚韧地生存. 华为手机里的"麦田守望者" 文 | 史中 (零)秋日故事 2020年10月,秋日的深圳暖阳轻抚,一位老大爷缓缓走 ...
- 算法学习之道,应有三重境界
https://www.toutiao.com/a6712297555167805966/ 王国维先生在<人间词话>中写道:古今之成大事业.大学问者,必经过三种境界:"昨夜西风凋 ...
- 学好算法,有三重境界
王国维先生在<人间词话>中写道:古今之成大事业.大学问者,必经过三种境界:"昨夜西风凋碧树.独上高楼,望尽天涯路."此第一境也."衣带渐宽终不悔,为伊消得人憔 ...
- 旅行大数据 -- 全球24个时区国家在同一天的生活
耐心看完,可以对全球国家的分布有一个初步了解. 早上6点,东萨摩亚岛的人还在沉睡,这是位于南太平洋的隶属于美国的小岛屿,面积仅有199平方公里,人口5万多人. 这里的经济来源主要是金枪鱼罐头出口,当地 ...
- 洛谷 P3959 [NOIP2017]宝藏 题解
通向地底的传送门 题目描述 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 \(n\) 个深埋在地下的宝藏屋, 也给出了这 \(n\) 个宝藏屋之间可供开发的$ m$ 条道路和它们的长度. 小明决 ...
- LuoguP3959 宝藏 题解
思路主要是抄_rqy的,这神仙位运算tql,整理一下思路. 题目大意 给定\(n\)个点,\(m\)条有权边,从一个点\(s\)开始挖(任选),形成一个生成树(即已经挖通的两个点间不能连边),挖一条边 ...
最新文章
- 模拟命令行自动输入的HTML,HTML5 命令行界面仿真和自动打字动画
- 【机器学习PAI实践十二】机器学习实现男女声音识别分类(含语音特征提取数据和代码)
- 信息系统项目管理师论文模板下载
- 大学python笔记_Python 上手笔记
- oracle sequence 不同 会话 不连续_序列 Sequence
- 我国自主播放软件暴风影音挑落微软
- spss进行偏相关分析
- Django视图模板_004
- 概率论考点之检验统计量(区间估计)
- 代码review神器Upsource,让你快乐的进行CodeReview
- 解决电脑屏幕变黄问题
- 用Python抓取漫画并制作mobi格式电子书
- 天盾linux数据恢复,天盾Linux数据恢复软件
- 微信小程序项目图片如何保存到本地的方法
- 货拉拉2021岗位招聘内推计划开始啦
- 变分原理(Variational Principle)
- 4.2.3偏移寻址(19)
- Maven项目在new module后,pom文件显示为Ignored pom.xml
- 想进Google,先来做做Google招聘题
- 硬核FutureTask解析