항 저 우 전기 문제 1878 오로라 회로 및 집합 + 오로라 회로

3303 단어
질문 주소
오 라 회 로
Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 11814    Accepted Submission(s): 4348
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
对于一个无向图,其为欧拉回路的充要条件为其是连通图,且顶点的度为偶数。
#include 
#include 
#include 
#include 
#define MAX_N 1005
#define MIN(a, b)	(a > b): a? b
using namespace std;
int par[MAX_N];
int d[MAX_N];
void init(int x)
{
	for (int i = 0; i <= x; i++) {
		par[i] = i;
		d[i] = 0;
	}
}
int find(int x)
{
	if (x == par[x])	return x;
	else	return find(par[x]);
}
void unite(int x, int y)
{
	int fx = find(x);
	int fy = find(y);
	if (fx != fy){
		par[fy] = fx;
	}
}
int main()
{
	int n, m, a, b;
	while (scanf("%d", &n) , n) {
		init(n);
		scanf("%d", &m);
		for (int i = 0; i < m; i++) {
			scanf("%d %d", &a, &b);
			unite(a, b);
			d[a]++;
			d[b]++;
		}
		int tree = 0;
		for (int i = 1; i <= n; i++) {
			if (i == par[i]) {
				tree++;
			}
		}
		if (tree != 1) {
			printf("0
"); continue; } for(int i = 1; i <= n; i++) { if(d[i] % 2 != 0) { tree = 0; break; } } if(tree) printf("1
"); else printf("0
"); } }

다음으로 전송:https://www.cnblogs.com/cniwoq/p/6770962.html

좋은 웹페이지 즐겨찾기