/
main.cpp
160 lines (137 loc) · 3.17 KB
/
main.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
#include <stdio.h>
#define MAX 1000
#define MAX_T 500
#define MAX_N 100000
#define MAX_ALFA 27
int grafo[MAX_ALFA][MAX_ALFA];
int visitados[MAX_ALFA];
int graus[MAX_ALFA];
int quant_vertices;
int quant_graus_impar;
int graus_vertice_origem[MAX_ALFA];
int graus_vertice_destino[MAX_ALFA];
void busca(int k){
for(int j = 0; j < MAX_ALFA ; j++){
if( (grafo[k][j] == 1 || grafo[j][k] == 1) && visitados[j] == 0){
visitados[j] = 1;
busca(j);
}
}
}
bool pode_ser_euleriano(){
bool flag = true;
quant_graus_impar = 0;
for (int l = 0; l < MAX_ALFA; l++){
// Tem grau par
if((graus_vertice_origem[l]+graus_vertice_destino[l]) % 2 ==0){
// Por ter grau par, tem que sair a mesma quantidade de arestas que chega.
if(graus_vertice_origem[l] != graus_vertice_destino[l]){
flag = false;
}
}
// Tem grau impar
else{
// Conta 1 para o grau impar
if(graus_vertice_origem[l]%2 != 0)
quant_graus_impar++;
// Conta 1 para o grau impar
if(graus_vertice_destino[l]%2 != 0)
quant_graus_impar++;
}
// Se passar de 2 graus impares entao nao eh euleriano
if (quant_graus_impar > 2){
flag = false;
}
}
return flag;
}
bool conexo(){
for(int l = 0; l < MAX_ALFA; l++){
if(graus[l] > 0){
visitados[l] = 1;
busca(l);
break;
}
}
int cont = 0;
for (int l = 0; l < MAX_ALFA; l++)
{
if(visitados[l] == 1)
cont++;
}
if(cont < quant_vertices)
return false;
return true;
}
int main(){
int tam_entrada;
char palavra[MAX];
int quant_palavras;
scanf("%d", &tam_entrada);
if(tam_entrada > MAX_T)
return 0;
for (int i = 0; i < tam_entrada; i++){
// Inicializacao, zerando tudo
for (int l = 0; l < MAX_ALFA; l++){
graus[l] = graus_vertice_origem[l] = graus_vertice_destino[l] = 0;
visitados[l] = 0;
for (int m = 0; m < MAX_ALFA; ++m){
grafo[l][m] = 0;
}
}
quant_vertices = 0;
// Lendo
scanf("%d", &quant_palavras);
if(quant_palavras > MAX_N || quant_palavras < 1)
return 0;
for (int j = 0; j < quant_palavras; j++){
scanf("%s", &palavra[0]);
int k;
for (k = 0; palavra[k+1] != '\0'; k++);
if(k == 0)
return 0;
int o = palavra[0]-'a';
int d = palavra[k]-'a';
graus_vertice_origem[o]++;
graus_vertice_destino[d]++;
grafo[o][d] = 1;
graus[o]++;
graus[d]++;
}
for (int j = 0; j < MAX_ALFA; j++)
{
if(graus[j] > 0)
quant_vertices++;
}
/*
if (1)
{
printf("\nQuantidade de vertices: %d\n", quant_vertices);
for (int l = 0; l < MAX_ALFA; ++l){
printf("%d ", graus_vertice_origem[l]);
}
printf("\n");
for (int l = 0; l < MAX_ALFA; ++l){
printf("%d ", graus_vertice_destino[l]);
}
printf("\n");
for (int l = 0; l < MAX_ALFA; ++l){
printf("%d ", visitados[l]);
}
printf("\n");
}
if(v)
printf("Sim pode ser euleriano\n");
if(c)
printf("Eh conexo\n");
*/
bool v = pode_ser_euleriano();
bool c = conexo();
if( v && c ){
printf("Ordering is possible.\n");
}else{
printf("The door cannot be opened.\n");
}
}
return 0;
}