本题解同步于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]所罗门王的宝藏】相关推荐

  1. 中国石油大学 个人训练赛第五场C:所罗门王的宝藏(高斯消元)

    题目描述 据古代传说记载,所罗门王既是智慧的代表,又是财富的象征.他建立了强大而富有的国家,聚集了大批的黄金象牙和钻石,并把这些价值连城的珍宝藏在一个神秘的地方,这就是世人瞩目的"所罗门王的 ...

  2. 【BZOJ5470】【FJOI2018】—所罗门王的宝藏(BFS)

    传送门 考虑每一颗绿宝石xxx向yyy连边,把一次加看做一个点的点值加 只需要看每个环上是否恒等,bfs即可 #include<bits/stdc++.h> using namespace ...

  3. yyb省选前的一些计划

    突然意识到有一些题目的计划,才可以减少大量查水表或者找题目的时间. 所以我决定这样子处理. 按照这个链接慢慢做. 当然不可能只做省选题了. 需要适时候夹杂一些其他的题目. 比如\(agc/arc/cf ...

  4. 其他-私人♂收藏(比赛记录 Mar, 2019)

    OwO 03.03 [USACO19JAN] A. Redistricting 题意:给 \(g\) ,求 \(f(n)\) . \(f(i)=f(j)+[g(i)\ge g(j)],j \in (i ...

  5. 华为手机里的“麦田守望者”

    为了一个理由, 有人英勇地死去, 为了一个理由, 有人坚韧地生存. 华为手机里的"麦田守望者" 文 | 史中 (零)秋日故事 2020年10月,秋日的深圳暖阳轻抚,一位老大爷缓缓走 ...

  6. 算法学习之道,应有三重境界

    https://www.toutiao.com/a6712297555167805966/ 王国维先生在<人间词话>中写道:古今之成大事业.大学问者,必经过三种境界:"昨夜西风凋 ...

  7. 学好算法,有三重境界

    王国维先生在<人间词话>中写道:古今之成大事业.大学问者,必经过三种境界:"昨夜西风凋碧树.独上高楼,望尽天涯路."此第一境也."衣带渐宽终不悔,为伊消得人憔 ...

  8. 旅行大数据 -- 全球24个时区国家在同一天的生活

    耐心看完,可以对全球国家的分布有一个初步了解. 早上6点,东萨摩亚岛的人还在沉睡,这是位于南太平洋的隶属于美国的小岛屿,面积仅有199平方公里,人口5万多人. 这里的经济来源主要是金枪鱼罐头出口,当地 ...

  9. 洛谷 P3959 [NOIP2017]宝藏 题解

    通向地底的传送门 题目描述 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 \(n\) 个深埋在地下的宝藏屋, 也给出了这 \(n\) 个宝藏屋之间可供开发的$ m$ 条道路和它们的长度. 小明决 ...

  10. LuoguP3959 宝藏 题解

    思路主要是抄_rqy的,这神仙位运算tql,整理一下思路. 题目大意 给定\(n\)个点,\(m\)条有权边,从一个点\(s\)开始挖(任选),形成一个生成树(即已经挖通的两个点间不能连边),挖一条边 ...

最新文章

  1. 模拟命令行自动输入的HTML,HTML5 命令行界面仿真和自动打字动画
  2. 【机器学习PAI实践十二】机器学习实现男女声音识别分类(含语音特征提取数据和代码)
  3. 信息系统项目管理师论文模板下载
  4. 大学python笔记_Python 上手笔记
  5. oracle sequence 不同 会话 不连续_序列 Sequence
  6. 我国自主播放软件暴风影音挑落微软
  7. spss进行偏相关分析
  8. Django视图模板_004
  9. 概率论考点之检验统计量(区间估计)
  10. 代码review神器Upsource,让你快乐的进行CodeReview
  11. 解决电脑屏幕变黄问题
  12. 用Python抓取漫画并制作mobi格式电子书
  13. 天盾linux数据恢复,天盾Linux数据恢复软件
  14. 微信小程序项目图片如何保存到本地的方法
  15. 货拉拉2021岗位招聘内推计划开始啦
  16. 变分原理(Variational Principle)
  17. 4.2.3偏移寻址(19)
  18. Maven项目在new module后,pom文件显示为Ignored pom.xml
  19. 想进Google,先来做做Google招聘题
  20. 硬核FutureTask解析

热门文章

  1. 我能为IT行业做什么
  2. NLTK使用方法总结
  3. 新浪(1998年12月—2000年3月)
  4. 离散数学之矩阵关系运算
  5. Excel阳历转农历VBA函数
  6. 如何把图片制作成GIF动图?GIF图是怎样合成的?
  7. Edge浏览器中使用IE浏览器网站
  8. java 短连接转长连接_HTTP的长连接和短连接转换接口(API)
  9. iOS开发各种证书详解
  10. WPS Excel+windows批处理批量重排序文件夹