题意
最少添加多少条边,使无向图有欧拉回路。
n,m≤106
题解
求出每个点的度数
奇度数点需要连一条新边
仅有偶度数点的连通块需要连两条新边
答案为上面统计的新边数 / 2
注意:此题默认以1为起点,有重边自环。

1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cmath> 5 #include<string> 6 using namespace std; 7 const int N=2000000; 8 int n,m,fa[N],vis[N],deg[N],flag[N],num,anss,ans; 9 int find(int x){ 10 if(fa[x]==x)return x; 11 else return fa[x]=find(fa[x]); 12 } 13 void merge(int x,int y){ 14 int a=find(x); 15 int b=find(y); 16 if(a==b)return; 17 fa[a]=b; 18 } 19 int main(){ 20 scanf("%d%d",&n,&m); 21 for(int i=1;i<=n;i++)fa[i]=i; 22 vis[1]=1; 23 for(int i=1,a,b;i<=m;i++){ 24 scanf("%d%d",&a,&b); 25 if(a!=b){ 26 deg[a]++;deg[b]++; 27 vis[a]=vis[b]=1; 28 merge(a,b); 29 } 30 else vis[a]=1; 31 } 32 for(int i=1;i<=n;i++){ 33 if(deg[i]&1){ 34 flag[find(i)]++; 35 } 36 } 37 for(int i=1;i<=n;i++) 38 if(vis[i]&&i==find(i)){ 39 if(flag[i])ans+=flag[i]; 40 else anss++; 41 num++; 42 } 43 ans/=2; 44 if(num==1)printf("%d",ans); 45 else printf("%d",ans+anss); 46 return 0; 47 }