题目说有n个点,m跳路,让你分最少的组,使,每组都走一天欧拉通路。。
通过判断度数是奇偶性来确定是否为欧拉回路;总之笔划数 = 奇度点数/2 + 欧拉回路数;
#include"stdio.h"
#include"string.h"
#define N 100001
int a[N*2],b[N*2];
struct node
{
int father;
int rank;
int degree;
int count;
}A[N];
int find(int x)
{
if(A[x].father==x)return x;
A[x].father=find(A[x].father);
return A[x].father;
}
void merge(int a,int b)
{
if(A[a].rank>=A[b].rank)
{
A[b].father=a;
if(A[a].rank==A[b].rank)
A[a].rank++;
A[a].count+=A[b].count;
}
else
{
A[a].father=b;
A[b].count+=A[a].count;
}
}
int main()
{
int n,m;
int i,j;
int x,y;
while(scanf("%d%d",&n,&m)!=-1)
{
memset(A,0,sizeof(A));
for(i=0;i<=n;i++)A[i].father=i;
for(i=0;i<m;i++)
{
scanf("%d%d",&a[i],&b[i]);
A[a[i]].degree++;
A[b[i]].degree++;
}
for(i=1;i<=n;i++)if(A[i].degree%2)A[i].count=1;
for(i=0;i<m;i++)
{
x=find(a[i]);
y=find(b[i]);
if(x!=y)merge(x,y);
}
int ans=0;
for(i=1;i<=n;i++)
{
if(A[i].degree&&A[i].father==i)
{
if(A[i].count!=0)ans+=A[i].count/2;
else ans++;
}
}
printf("%d\n",ans);
}
return 0;
}