-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathFinding Articulation points dfs.cpp
142 lines (82 loc) · 2.04 KB
/
Finding Articulation points dfs.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
#include<bits/stdc++.h>
using namespace std;
#define pb push_back
#define ll long long int
#define mp make_pair
#define mt make_tuple
#define mod 100000
#define for1(k,n) for(ll i=k;i<n;i++)
#define for2(k,n) for(ll j=k;j<n;j++)
#define E cout<<endl
#define max 50000
#define IOS ios_base:: sync_with_stdio(false);cin.tie(0);
//ACTUALLY DIJKSTRA'S ALGORITHM USED FOR FINDING SHORTEST PATH FROM ONE SOURCE TO ALL THE VERTICES OF THE GRAPH......
int n;
vector <int> *adj;
int *vis;
int *in;
int *low;
int timer;
vector <int> ArtPoint;
void dfs(int s, int par = -1)
{
vis[s] = 1;
in[s] = low[s] = timer;
timer++;
int children = 0;
for1(0, adj[s].size())
{
if (adj[s][i] == par)
continue;
if (vis[adj[s][i]] == 1)
{
low[s] = min(low[s], in[adj[s][i]]);
}
else
{
dfs(adj[s][i], s);
low[s] = min(low[s], low[adj[s][i]]);
if (low[adj[s][i]] >= in[s] && par != -1)
ArtPoint.pb(s);
++children;
}
}
if (par == -1 && children > 1)
ArtPoint.pb(s);
}
int main()
{
//////////////////////////////////////start...............
//many of the variables are declared globally for not passing to functions.....
int e, u, v;
cin >> n >> e;
adj = new vector <int> [n + 1];
vis = new int [n + 1];
low = new int [n + 1];
in = new int [n + 1];
fill(vis, vis + n + 1, 0);
fill(low, low + n + 1, -1);
fill(in, in + n + 1, -1);
while (e--)
cin >> u >> v , adj[u].pb(v) , adj[v].pb(u);
dfs(1, -1);
for (int i = 1; i <= n; i++)
{
if (vis[i] == 0)
{
dfs(i);
}
}
cout << "Articulation Points-------\n";
for (int i = 0; i < ArtPoint.size(); i++)
cout << ArtPoint[i] << endl;
/////////////////////////////end................................... ....
return 0;
}
//c v a s selecting text or x for selecting cut
//ctrl+d after selecting text to select same type
//ctrl+shift+d for copy and paste the line below it
//ctrl+del to delete a text
//ctrl+left to jump left of line or vice versa
//ctrl+shift+"/" to comment whole block and vice versa for undo
//ctrl+"/" for commenting a line