【题解】CF209C

一:【题意】

给定一张无向图,问最少加多少条边能够存在从 \(1\) 开始的欧拉回路
\(n,m<=10^6\)

二:【解法】

主要解决联通与奇偶

统计奇点个数 \(odd\) ,统计有边包含1的联通块个数 \(sum\)
如果 \(sum==1\) ,直接输出 \(odd/2\)
否则统计有边且不包含奇点包含1的联通块个数 \(res\)
输出 \(odd/2+res\)

三:【代码】

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
vector<int> mp[N];
int bcj[N],deg[N],tag[N];
int find(int x){
	if(x==bcj[x]) return x;
	return bcj[x]=find(bcj[x]);
}
int main(){
	//freopen("in.txt","r",stdin);
	int n,m;cin>>n>>m;
	for(int i=1;i<=n;i++) bcj[i]=i;
	while(m--){
		int a,b;cin>>a>>b;
		mp[a].push_back(b);
		mp[b].push_back(a);
		deg[a]++;deg[b]++;
		a=find(a);b=find(b);
		bcj[a]=b;
	}
	int odd=0,sum=0,res=0;
	for(int i=1;i<=n;i++){
		if(deg[i]&1){
			odd++;
			tag[find(i)]=1;
		}
	}
	for(int i=1;i<=n;i++){
		if(find(i)!=i) continue;
		if(mp[i].size()||i==1){
			sum++;
			if(!tag[i]) res++;
		}
	}
	if(sum==1) cout<<odd/2<<"\n";
	else cout<<odd/2+res<<"\n";
	return 0;
}
posted @ 2026-01-13 10:42  Ming3398  阅读(7)  评论(0)    收藏  举报