【题解】

  我们可以发现不在最小生成树上的边一定不能多次经过,因为一条不在最小生成树上的边(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 旅游相关推荐

  1. 牛客网NOIP赛前集训营 提高组(第七场)

    中国式家长 2 链接:https://www.nowcoder.com/acm/contest/179/A 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K ...

  2. 牛客网NOIP赛前集训营-提高组(第六场)B-选择题

    题目描述 有一道选择题,有 a,b,c,d 四个选项. 现在有 n 个人来做这题,第 i 个人有 pi,j 的概率选第 j 个选项. 定义\(cnt(x)\)为选第$ x $个选项的人数. 令\(mx ...

  3. 牛客网NOIP赛前集训营-提高组(第六场)B-选择题[背包]

    题意 题目链接 分析 直接背包之后可以 \(O(n)\) 去除一个物品的影响. 注意特判 \([p==1]\) 的情况. 总时间复杂度为 \(O(n^2)\) . 代码 #include<bit ...

  4. [NowCoder]牛客网NOIP赛前集训营-提高组(第六场)题解

    A.最长路 题意:给定有向图,每条边有个字符\([0,10^9]\),求每个点最长路字典序最小的方案.\(N,M\le 10^6\) 建反图跑拓扑排序,显然入过队的点都有最长路,考虑如何判断字典序大小 ...

  5. 牛客网NOIP赛前集训营-提高组(第七场)C 洞穴

    洞穴 思路: 矩阵乘法 由于只需要知道 A ^ l 的 第a行第b个元素 所以我们每次在做矩阵乘法时只需要算第a行就可以了 还要像矩阵快速幂一样预处理A ^ (1<<d) 代码: #pra ...

  6. 牛客网NOIP赛前集训营-提高组(第七场)C-洞穴

    题目描述 有一天,牛牛找到了一个巨大的洞穴.洞穴可以描述成一个有向图,一共有\(N\)个节点(从\(1\)到\(N\)编号)和\(M\)条长度为\(1\)的有向边,每条边从某一个节点\(u\)连向另一 ...

  7. 【题解】[牛客网NOIP赛前集训营-提高组(第七场)]C.洞穴 倍增优化DP+bitset

    题目链接 #include<cstdio> #include<bitset> using namespace std; const int N=110; int n,m,q; ...

  8. 牛客网NOIP赛前集训营-普及组(第一场)

    前三题略 T4: 题目描述 小A有n个长度都是L的字符串.这些字符串只包含前8个小写字符,'a'~'h'.但这些字符串非常的混乱,它们几乎长得互不相同.小A想通过一些规则,让它们长得尽可能相同.小A现 ...

  9. Nowcoder | [题解-N165]牛客网NOIP赛前集训营-普及组(第二场)

    啊...表示一大早还没睡醒就开始打比赛(开始前一分钟的我还在桌子上趴着休眠)...表示题目思路清奇(尤其C题)...但是我还是太蒻了...\(D\)题暴力都没打...题解正式开始之前先\(\%\)一下 ...

最新文章

  1. 知乎进化:对抗内容“熵增”胜算几何?
  2. 面试官:为什么SpringBoot的 jar 可以直接运行?
  3. mysql将大表定时转储_mysql数据库数据定时封装转储
  4. 禅道11.0windows本机安装
  5. 工信部发布《区块链 数据格式规范》标准(PPT全文)
  6. 开源博客-秋色园QBlog多用户博客系统安装视频教程
  7. 2020统计局的行政划分表_国家统计局:月入2000-5000元并非“中等收入群体”
  8. 人脸表情识别从0到部署,猜猜『轮到你了』的微笑狼人到底是谁!
  9. 适配器模式C++实现
  10. 软件工程 CI持续集成实例 Zanata+github+Jenkins
  11. 从零开始做一个开源项目 学习笔记
  12. RENIX软件OSPF和BFD、ISIS和BFD联动测试——网络测试仪实操
  13. Java中面向接口编程的简单案例(电脑、鼠标、键盘、USB接口)
  14. 夹水晶头8根网线的顺序
  15. mysql订单表和订单详情表_订单详情表,与,订单表 怎么做?
  16. 全国哀悼日,CSS如何把整个网页黑白显示
  17. 网页星号点号密码查看最简方法
  18. 简述linux的系统组成,【简答题】Linux操作系统有哪几个部分组成?请简述每个组成部分的作用。...
  19. Windows下使用SSD检测
  20. 安师大计算机系导师,安徽师范大学数学计算机科学学院导师介绍:陈付龙

热门文章

  1. 【vijos P1914】【codevs 3904】[NOIP2014 普及组T4]子矩阵(dfs+状压dp)
  2. 在web浏览器上显示室内温度(nodeJs+arduino+socket.io)
  3. Redis——学习之路三(初识redis config配置)
  4. C/C++中printf和C++中cout的输出格式
  5. C/C++笔试经典程序(二)
  6. ACM将一个十进制的数转换为一个十六进制的数输出
  7. 转 .net里如何判断中文字符长度
  8. 【零基础学Java】—包装类(三十七)
  9. 零基础快速开发全栈后台管理系统(Vue3+ElementPlus+Koa2)—项目概述篇(一)
  10. JavaScript学习(七十六)—this的指向问题