牛客网NOIP赛前集训营 提高组 第5场 T2 旅游
【题解】
我们可以发现不在最小生成树上的边一定不能多次经过,因为一条不在最小生成树上的边(u,v)的边权比最小生成树上(u,v)之间的路径更长,选择不在最小生成树上的边一定不划算。
我们还需要确定最小生成树上哪些边需要经过两次。我们发现如果某个点当前的度为奇数,这个点到它的父亲的边要经过两次,所以我们在它和它父亲之间多连上一条边(即把他们的度都加1).
这样一次dfs我们就可以从下往上确定出需要经过两次的边。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define LL long long 5 #define N 500010 6 #define rg register 7 using namespace std; 8 const int Mod=998244353; 9 int n,m,tot,cnt,last[N],in[N],fa[N]; 10 LL ans,Pow[N]; 11 struct edge{int to,pre,dis;}e[N<<1]; 12 struct rec{int u,v;}r[N]; 13 inline int read(){ 14 int k=0,f=1; char c=getchar(); 15 while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar(); 16 while('0'<=c&&c<='9')k=k*10+c-'0',c=getchar(); 17 return k*f; 18 } 19 void dfs(int x,int f,int eg){ 20 for(rg int i=last[x],to;i;i=e[i].pre)if((to=e[i].to)!=f) dfs(to,x,i); 21 if((in[x]&1)&&x!=1) ans=(ans+Pow[e[eg].dis])%Mod,in[f]++; 22 } 23 int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);} 24 int main(){ 25 n=read(); m=read(); Pow[0]=1; 26 for(rg int i=1;i<=m;i++){ 27 Pow[i]=(Pow[i-1]<<1)%Mod; ans=(ans+Pow[i])%Mod; 28 in[r[i].u=read()]++; in[r[i].v=read()]++; 29 } 30 for(rg int i=1;i<=n;i++) fa[i]=i; 31 for(rg int i=1;i<=m;i++){ 32 int u=r[i].u,v=r[i].v; 33 if(find(u)!=find(v)){ 34 e[++tot]=(edge){u,last[v],i}; last[v]=tot; 35 e[++tot]=(edge){v,last[u],i}; last[u]=tot; 36 fa[find(u)]=find(v); 37 cnt++; if(cnt==n-1) break; 38 } 39 } 40 dfs(1,0,0); 41 printf("%lld\n",ans); 42 return 0; 43 }
转载于:https://www.cnblogs.com/DriverLao/p/9795786.html
牛客网NOIP赛前集训营 提高组 第5场 T2 旅游相关推荐
- 牛客网NOIP赛前集训营 提高组(第七场)
中国式家长 2 链接:https://www.nowcoder.com/acm/contest/179/A 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K ...
- 牛客网NOIP赛前集训营-提高组(第六场)B-选择题
题目描述 有一道选择题,有 a,b,c,d 四个选项. 现在有 n 个人来做这题,第 i 个人有 pi,j 的概率选第 j 个选项. 定义\(cnt(x)\)为选第$ x $个选项的人数. 令\(mx ...
- 牛客网NOIP赛前集训营-提高组(第六场)B-选择题[背包]
题意 题目链接 分析 直接背包之后可以 \(O(n)\) 去除一个物品的影响. 注意特判 \([p==1]\) 的情况. 总时间复杂度为 \(O(n^2)\) . 代码 #include<bit ...
- [NowCoder]牛客网NOIP赛前集训营-提高组(第六场)题解
A.最长路 题意:给定有向图,每条边有个字符\([0,10^9]\),求每个点最长路字典序最小的方案.\(N,M\le 10^6\) 建反图跑拓扑排序,显然入过队的点都有最长路,考虑如何判断字典序大小 ...
- 牛客网NOIP赛前集训营-提高组(第七场)C 洞穴
洞穴 思路: 矩阵乘法 由于只需要知道 A ^ l 的 第a行第b个元素 所以我们每次在做矩阵乘法时只需要算第a行就可以了 还要像矩阵快速幂一样预处理A ^ (1<<d) 代码: #pra ...
- 牛客网NOIP赛前集训营-提高组(第七场)C-洞穴
题目描述 有一天,牛牛找到了一个巨大的洞穴.洞穴可以描述成一个有向图,一共有\(N\)个节点(从\(1\)到\(N\)编号)和\(M\)条长度为\(1\)的有向边,每条边从某一个节点\(u\)连向另一 ...
- 【题解】[牛客网NOIP赛前集训营-提高组(第七场)]C.洞穴 倍增优化DP+bitset
题目链接 #include<cstdio> #include<bitset> using namespace std; const int N=110; int n,m,q; ...
- 牛客网NOIP赛前集训营-普及组(第一场)
前三题略 T4: 题目描述 小A有n个长度都是L的字符串.这些字符串只包含前8个小写字符,'a'~'h'.但这些字符串非常的混乱,它们几乎长得互不相同.小A想通过一些规则,让它们长得尽可能相同.小A现 ...
- Nowcoder | [题解-N165]牛客网NOIP赛前集训营-普及组(第二场)
啊...表示一大早还没睡醒就开始打比赛(开始前一分钟的我还在桌子上趴着休眠)...表示题目思路清奇(尤其C题)...但是我还是太蒻了...\(D\)题暴力都没打...题解正式开始之前先\(\%\)一下 ...
最新文章
- 知乎进化:对抗内容“熵增”胜算几何?
- 面试官:为什么SpringBoot的 jar 可以直接运行?
- mysql将大表定时转储_mysql数据库数据定时封装转储
- 禅道11.0windows本机安装
- 工信部发布《区块链 数据格式规范》标准(PPT全文)
- 开源博客-秋色园QBlog多用户博客系统安装视频教程
- 2020统计局的行政划分表_国家统计局:月入2000-5000元并非“中等收入群体”
- 人脸表情识别从0到部署,猜猜『轮到你了』的微笑狼人到底是谁!
- 适配器模式C++实现
- 软件工程 CI持续集成实例 Zanata+github+Jenkins
- 从零开始做一个开源项目 学习笔记
- RENIX软件OSPF和BFD、ISIS和BFD联动测试——网络测试仪实操
- Java中面向接口编程的简单案例(电脑、鼠标、键盘、USB接口)
- 夹水晶头8根网线的顺序
- mysql订单表和订单详情表_订单详情表,与,订单表 怎么做?
- 全国哀悼日,CSS如何把整个网页黑白显示
- 网页星号点号密码查看最简方法
- 简述linux的系统组成,【简答题】Linux操作系统有哪几个部分组成?请简述每个组成部分的作用。...
- Windows下使用SSD检测
- 安师大计算机系导师,安徽师范大学数学计算机科学学院导师介绍:陈付龙
热门文章
- 【vijos P1914】【codevs 3904】[NOIP2014 普及组T4]子矩阵(dfs+状压dp)
- 在web浏览器上显示室内温度(nodeJs+arduino+socket.io)
- Redis——学习之路三(初识redis config配置)
- C/C++中printf和C++中cout的输出格式
- C/C++笔试经典程序(二)
- ACM将一个十进制的数转换为一个十六进制的数输出
- 转 .net里如何判断中文字符长度
- 【零基础学Java】—包装类(三十七)
- 零基础快速开发全栈后台管理系统(Vue3+ElementPlus+Koa2)—项目概述篇(一)
- JavaScript学习(七十六)—this的指向问题