-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathEncontrandoPuntosArticulacion.cpp
executable file
·103 lines (86 loc) · 2.01 KB
/
EncontrandoPuntosArticulacion.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
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
int vertices, aristas, a, b;
vector<int> grafo[10005];
int cantPuntos = 0;
int cantHijosRaiz = 0;
bool visitados[10005];
int pi[10005];
int tiempo = 0;
bool puntosArticulacion[10005];
int d[10005];
int low[10005];
void DFS_visit(int elemento)
{
visitados[elemento] = true;
tiempo++;
d[elemento] = tiempo;
low[elemento] = d[elemento];
for(int i = 0; i < grafo[elemento].size(); i++)
{
int temp = grafo[elemento][i];
if(!visitados[temp])
{
pi[temp] = elemento;
if(elemento == 1)
cantHijosRaiz++;
DFS_visit(temp);
low[elemento] = min(low[elemento], low[temp]);
if(pi[elemento] != INT_MIN && low[temp] >= d[elemento])
{
if(!puntosArticulacion[elemento])
cantPuntos++;
puntosArticulacion[elemento] = true;
}
}
else if(pi[temp] != elemento)
low[elemento] = min(low[elemento], d[temp]);
}
}
void DFS()
{
for(int i = 1; i <= vertices; i++)
{
if(!visitados[i])
{
cantHijosRaiz = 0;
DFS_visit(i);
}
}
}
void dame_puntos_articulacion()
{
pi[1] = INT_MIN;
DFS();
if(cantHijosRaiz >= 2)
{
cantPuntos++;
puntosArticulacion[1] = true;
}
}
int main()
{
ios_base :: sync_with_stdio(0);
cin.tie(0);
cin >> vertices >> aristas;
for(int i = 0; i < aristas; i++)
{
cin >> a >> b;
grafo[a].push_back(b);
grafo[b].push_back(a);
}
dame_puntos_articulacion();
if(cantPuntos == 0)
cout << -1 << endl;
else
{
cout << cantPuntos << endl;
for(int i = 0; i < 10005; i++)
{
if(puntosArticulacion[i])
cout << i << " ";
}
cout << endl;
}
}