HDU 3018 Ant Trip

  九野的博客,转载请注明出处:  http://blog.csdn.net/acmmmm/article/details/10858065

题意:n个点m条边的无向图,求用几笔可以把所有边画完(画过的边不再画)

思路:

并查集+欧拉回路

对于每个连通分量,若是欧拉回路则一笔画完,若不是则 需要: 奇度数点个数/2

然后把每个连通分量所需的笔数相加

这里要注意一个点是不用画的

 

#include<stdio.h>

#include<algorithm>

#include<iostream>

#include<set>

#include<math.h>

#include<string.h>

#define N 100010

using namespace std;

int f[N],d[N],fenliang[N];

int find(int x){

	if(x==f[x])return x;

	return f[x]=find(f[x]);

}

int main(){

	int n,m,i,j,u,v;

	while(~scanf("%d%d",&n,&m)){

		for(i=1;i<=n;i++)f[i]=i;

		memset(d,0,sizeof(d));

		memset(fenliang,-1,sizeof(fenliang));

		while(m--)

		{

			scanf("%d%d",&u,&v);

			if(u>v){j=u;u=v;v=j;}

			else if(u==v)continue;

			f[find(u)]=find(v);

			d[u]++,d[v]++;

		}

		int ans=0;

		for(i=1;i<=n;i++)

		{

			find(i);

			if(fenliang[f[i]]==-1 && d[i]>0)fenliang[f[i]]=0;

			if(d[i]&1)fenliang[f[i]]++;

		}

		for(i=1;i<=n;i++)

			if(fenliang[i]>0)ans+=fenliang[i]/2;

			else if(fenliang[i]==0)ans++;

		printf("%d\n",ans);

	}

	return 0;

}

/*

4 7

1 2

1 3

1 4

2 3

2 4

3 4

3 3



4 5

1 2

2 3

4 4

4 4

4 4



*/


你可能感兴趣的:(ant)