码迷,mamicode.com
首页 > 其他好文 > 详细

CF209C Trails and Glades 无向图欧拉回路

时间:2021-01-16 12:11:23      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:href   void   一个   需求   cond   blank   lse   second   line   

题意:

戳这里

分析:

  • 前置芝士:无向图欧拉回路

打眼一看,以为是一道水题

直接求出奇度数的点然后连边就行了

没想到,傻子还是我自己

给出的图并不保证联通,还要求必须从 \(1\) 出发走一条欧拉回路,所以我们为了保证联通,按连通块为单位进行考虑,连通块只有 \(3\) 种情况,仅有 奇度数点 , 仅有偶度数点,两者都有,我们分开考虑

  1. 对于有奇度数点的连通块,本身奇度数点就要向外连边,所以连通块一定会与别的连通块相连,
  2. 对于仅有偶度数的点,本身可以形成欧拉回路,但是要和外界联通,那么必须向外连边,由于还要保证自身维持偶度数,所以需要向外连 \(2\) 条边

那么答案就是( 奇度数的点的个数+仅含偶度数的点的连通块个数 * 2 )/ 2

因为一条边可以同时满足两个点的需求

tip: 还要特判一种情况就是,仅含一个连通块,且连通块没有奇度数的点,此时不需要加任何边

代码:

#include<bits/stdc++.h>
#define pii pair<int,int>
#define mk(x,y) make_pair(x,y)
#define lc rt<<1
#define rc rt<<1|1
#define pb push_back
#define fir first
#define sec second
#define inl inline
#define reg register

using namespace std;

namespace zzc
{
	inline int read()
	{
		int x=0,f=1;char ch=getchar();
		while (!isdigit(ch)){if (ch==‘-‘) f=-1;ch=getchar();}
		while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
		return x*f;
	}
	
	const int maxn = 1e6+5;
	int n,m,cnt,ans;
	int deg[maxn];
	bool con[maxn],odd,flag,vis[maxn];
	vector<int> e[maxn];
	
	void dfs(int u)
	{
		vis[u]=true;
		if(deg[u]&1) flag=true;
		for(auto v:e[u]) if(!vis[v]) dfs(v);
	}
	
	void work()
	{
		int a,b;
		n=read();m=read();
		for(int i=1;i<=m;i++)
		{
			a=read();b=read();
			con[a]=con[b]=true;
			e[a].pb(b);e[b].pb(a);
			deg[a]++;deg[b]++;
		}
		con[1]=1;
		for(int i=1;i<=n;i++)
		{
			if(deg[i]&1)
			{
				ans++;
				odd=true;
			}
			else if(!vis[i]&&con[i])
			{
				cnt++;
				flag=false;
				dfs(i);
				if(!flag) ans+=2;
			}
		}
		if(odd==false&&cnt==1) ans=0;
		printf("%d\n",ans/2);
	}

}

int main()
{
	zzc::work();
	return 0;
}

CF209C Trails and Glades 无向图欧拉回路

标签:href   void   一个   需求   cond   blank   lse   second   line   

原文地址:https://www.cnblogs.com/youth518/p/14284956.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!