HDU - 1878 - 오로라 회로 [그리고 집합]

오 라 회 로
Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 12708    Accepted Submission(s): 4720
Problem Description
오 라 회 로 는 펜 이 지면 을 떠 나 지 못 하 게 그림 의 각 변 을 한 번 만 그 릴 수 있 고 출발점 으로 돌아 갈 수 있 는 회 로 를 말한다.이제 오 라 회 로 가 있 는 지 그림 을 정 해 주 시 겠 습 니까?
 
Input
테스트 입력 은 약간의 테스트 용례 를 포함한다.각 테스트 용례 의 첫 번 째 줄 은 두 개의 정수 로 노드 수 N (1 < N < 1000) 과 변수 M 을 제시한다.그 다음 에 M 줄 은 M 개의 변 에 대응 하고 각 줄 은 한 쌍 의 정 수 를 제시 하 는데 각각 이 변 이 직접 연 결 된 두 노드 의 번호 (노드 는 1 에서 N 번호) 이다.N 이 0 일 때 입력 매듭
다발
 
Output
모든 테스트 용례 의 출력 은 한 줄 을 차지 하고, 오로라 회로 가 존재 하면 1 을 출력 하고, 그렇지 않 으 면 0 을 출력 한다.
 
Sample Input
 
   
3 3 1 2 1 3 2 3 3 2 1 2 2 3 0
 

Sample Output
 
   
1 0

定理1:连通多重图中存在欧拉回路当且仅当图中所有顶点的度数为偶数。

定理2:连通多重图中存在欧拉通路且不存在欧拉回路当且仅当连通图中有且只用两个顶点的度数为奇数。

所以存在欧拉回路的条件是:1、所有结点的度数为偶数2、不存在有独立的点

#include
#include
#include
using namespace std;
int n,m;
int fa[1010];
int degree[1010];
int find(int x)
{
	if(x==fa[x])	return x;
	return find(fa[x]);
}
void Union(int x,int y)
{
	int nx=find(x);
	int ny=find(y);
	if(nx!=ny)  //             //       1 2(  ),1 3(  ),2 3(   ) 
	{
		fa[ny]=nx;
	}
}
int main()
{
	while(scanf("%d",&n),n)
	{
		scanf("%d",&m);
		memset(degree,0,sizeof(degree));
		for(int i=1;i<=n;i++)
			fa[i]=i;
		int a,b;
		for(int i=1;i<=m;i++)
		{
			scanf("%d %d",&a,&b);
			degree[a]++;
			degree[b]++;
			Union(a,b);
		}
		bool flag=0;
		int cnt=0;
		for(int i=1;i<=n;i++)
		{
			if(fa[i]==i)	cnt++;   //           
			if(degree[i]&1)	flag=1;  //             
		}
		if(!flag&&cnt==1)	puts("1");
		else	puts("0");
	}
	return 0;
}

좋은 웹페이지 즐겨찾기