PAT - 1126 Camino euleriano

enlaces a los temas: https://pintia.cn/problem-sets/994805342720868352/problems/994805349851185152

Sujeto al efecto:

Euleriano: de punto fijo y toda la comunicación es aún en la figura.

Semi-euleriano: comunicación figura, y sólo un número impar de puntos es de dos

No euleriano: Otros

Análisis: disjuntos-set determina si el gráfico de conectividad, mirada en cada punto de la lata, el problema principal se ha leído. . .

#include <bits/stdc++.h>
using namespace std;
const int N = 510;
int n, m, deg[N], pre[N], num[N];
void init() {
	for(int i = 1; i < N; i++) {
		pre[i] = i;
		num[i] = 1;
	}
}
int find(int x) {
	return x == pre[x] ? x : pre[x] = find(pre[x]);
}
void unionn(int a, int b) {
	int ra = find(a);
	int rb = find(b);
	if(ra != rb) {
		pre[rb] = ra;
		num[ra] += num[rb];
	}
}
int main() {
	init();
	scanf("%d %d", &n, &m);
	int a, b, odd = 0, even = 0;
	while(m--) {
		scanf("%d %d", &a, &b);
		deg[a]++;
		deg[b]++;
		unionn(a, b);
	}
	for(int i = 1; i <= n; i++) {
		if(deg[i] % 2 == 0) even++;
		else odd++;
	}
	for(int i = 1; i <= n; i++)
		printf("%d%s", deg[i], i == n ? "\n" : " ");
	int rt = find(1);
	if(num[rt] != n) {
		printf("Non-Eulerian\n");
	} else {
		if(even == n) printf("Eulerian\n");
		else if(odd == 2) printf("Semi-Eulerian\n");
		else printf("Non-Eulerian\n");
	}
	return 0;
}

 

Publicados 150 artículos originales · ganado elogios 4 · Vistas 6926

Supongo que te gusta

Origin blog.csdn.net/Napom/article/details/103338865
Recomendado
Clasificación