标签: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