HDU 1878 오로라 회로 (및 집합: 단순 오로라 회로 판정)

2048 단어 도 론 - 오 라 토
오 라 회 로 시간 제한: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 18877    Accepted Submission(s): 7350   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     Author ZJU     Source 절 대 컴퓨터 대학원 재시험    Recommend We have carefully selected several similar problems for you:  1879 1880 1877 1881 1863   
 
분석:
템 플 릿 문제:
1. 그림 연결 (집합 검사)
2. 모두 짝수
 
#include 
#include 
#define N 1000
 
using namespace std;
 
int n, m;
int f[N],degree[N];//   i    
 
void init()
{
	for (int i = 1; i <= n; i++)
		f[i] = i;
}
int find(int x)
{
	return x == f[x] ? x : f[x] = find(f[x]);
}
void merge(int x, int y)
{
	int t1, t2;
	t1 = find(x); t2 = find(y);
	if (t1 != t2)	f[t2] = t1;
	else return;
}
int isEuler()
{
	for (int i = 1; i <= n; i++)
		if (degree[i] & 1)	return 0;
	return 1;
}
int isconnect()
{
	int cnt = 0;
	for (int i = 1; i <= n; i++)
	{
		if (f[i] == i)
			cnt++;
	}
	if (cnt == 1)	return 1;
	else return 0;
}
int main()
{
	while (scanf("%d", &n) != EOF && n)
	{
		init();
		memset(degree, 0, sizeof(degree));
		scanf("%d", &m);
		int t1, t2;
		for (int i = 0; i < m; i++)
		{
			scanf("%d%d", &t1, &t2);
			//   t1,t2     
			if (t1 == t2)
				continue;
			degree[t1]++; degree[t2]++;
			merge(t1, t2);
		}
		printf("%d
", isEuler() && isconnect()); } return 0; }

좋은 웹페이지 즐겨찾기