【题解】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;
}

浙公网安备 33010602011771号