标签:href void 一个 需求 cond blank lse second line
打眼一看,以为是一道水题
直接求出奇度数的点然后连边就行了
没想到,傻子还是我自己
给出的图并不保证联通,还要求必须从 \(1\) 出发走一条欧拉回路,所以我们为了保证联通,按连通块为单位进行考虑,连通块只有 \(3\) 种情况,仅有 奇度数点 , 仅有偶度数点,两者都有,我们分开考虑
那么答案就是( 奇度数的点的个数+仅含偶度数的点的连通块个数 * 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