旅游

这是一篇关于计算旅行者从1号景点出发,经过所有道路返回1号景点的最低疲劳度问题的文章。给定景点数n和道路数m,每条道路长度为2i,目标是找到最小总长度的游览计划,确保每条道路至少经过一次。题目描述了不同规模的数据限制,并提供了两个示例。解决方案涉及到构建最小生成树并进行特定调整。
摘要由CSDN通过智能技术生成

题目描述

暑假,可怜打算去旅游。 在可怜的计划中,可怜一共打算游玩 n 个景点,这些景点被 m 条双向道路联通(即任何两个景点之间都能通过道路直接或者间接到达)。第 i 条道路的长度为 2i。 因为这 n 个景点中,只有 1 号景点在机场附近,所以可怜想要制定一个从 1 号点出发,沿着道路一路游玩,并在最后回到 1 号点的游览计划。同时因为每一条道路都有不一样的风景,于是可怜想要在这个计划中,经过每一条道路至少一次(只要从一个方向走过就算经过过这条道路)。 令一个游览计划的疲劳度为行走长度的总和(多次经过的边长度被多次计算),可怜想要计算所有满足条件的游览计划中疲劳度的最小值。

输入描述:

第一行输入两个整数 n,m 表示景点数和道路数。接下来 m 行每行两个整数 ui,vi 表示第 i 条双向道路连接着 ui,vi。数据保证图中没有重边和自环且联通。 的数据,n,m ≤ 10. 的数据,n ≤ 20. 的数据,n,m ≤ 5000. 的数据,1 ≤ n,m ≤ 5 x 105.

输出描述:

输出一行一个整数,表示疲劳度的最小值。可以证明一定存在满足条件的游览方案。同时答案可能很大,你只需要输出对 998244353 取模后的值。

示例1

输入

4 5
1 2
3 4
2 3
1 3
2 4

输出

70

示例2

输入

6 10
4 6
4 5
3 6
5 2
3 2
1 2
3 4
6 1
2 4
1 3

输出

2132

思路

只有最小生成树上的边的 a[i] 会 >1
证明:使用最小生成树上两点之间的路径一定是图中经过边权最大值最小的 路径可以直接得到
所以只需要求出最小生成树,然后在最小生成树上调整就可以了
代码里还有一些要注意的地方

代码

#include<bits/stdc++.h>
#define ls (x<<1)
#define rs (x<<1|1)
#define mid ((l+r)>>1)
using namespace std;
int const xn=5e5+5,xm=5e5+5,mod=998244353;
int n,m,hd[xn],ct,nxt[xn<<1],to[xn<<1],fa[xn],dep[xn],bin[xn];
int bh[xn],s[xm],ans,dfn[xn],id[xn<<1],son[xn],siz[xn],top[xn],tim,sum[xn<<2];
bool rev[xn<<2];
struct N
{
   
 int u,v;
}e[xm];
int rd()
{
   
 int ret=0,f=1;
 char ch=getchar();
 while(ch<'0'||ch>'9')
 {
   
  if(ch=='-')
   f=0; 
  ch=getchar();
 }
 while(ch>='0'&&ch<='9')
  ret=(ret<<3)+(ret<<1)+ch-'0',ch=getchar();
 return f?ret:-ret;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值