【JZOJ A组】旅游

Description

在这里插入图片描述

Input

在这里插入图片描述

Output

在这里插入图片描述

Sample Input

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

Sample Output

2132

Data Constraint

在这里插入图片描述

思路

如果每条边能走一次就遍历完全图,这个就是欧拉回路。
一个图是欧拉回路当且仅当每个点的度数为偶数。
我们需要计算哪几条边会重复走
如果一条边两端的点的度数为奇数,则一定要重复走

代码

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=6e5+77,mod=998244353;
int n,m,fa[maxn],dis[maxn],ans,list[maxn],cnt,d[maxn];
struct E
{
	int to,next,v;
}e[maxn*3];
int gf(int x)
{
	if(fa[x]==x) return x;else return fa[x]=gf(fa[x]);
}
void add(int u,int v,int val)
{
	e[++cnt].to=v; e[cnt].next=list[u]; list[u]=cnt; e[cnt].v=val;
}
int dfs(int u,int fa)
{
	int s=d[u]%2,s1;
	for(int i=list[u]; i; i=e[i].next)
	{
		int v=e[i].to;
		if(v==fa) continue;
		s1=dfs(v,u);
		if(s1%2==1) ans=(ans+e[i].v)%mod;
		s+=s1;
	}
	return s;
}
int main()
{
	freopen("travel.in","r",stdin); freopen("travel.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1; i<=n; i++) fa[i]=i;
	dis[0]=1; for(int i=1; i<=m; i++) dis[i]=dis[i-1]*2%mod,ans=(ans+dis[i])%mod;
	for(int i=1; i<=m; i++)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		int u=gf(x),v=gf(y);
		if(u!=v) add(x,y,dis[i]),add(y,x,dis[i]),fa[u]=fa[v];
		d[x]++,d[y]++;
	}
	dfs(1,0);
	printf("%d",ans);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值