summaryrefslogtreecommitdiff
path: root/graph
diff options
context:
space:
mode:
authormzuenni <mzuenni@users.noreply.github.com>2017-07-22 12:28:21 +0200
committerGitHub <noreply@github.com>2017-07-22 12:28:21 +0200
commita8a76010ed04bc931a09121847a93c3ca468e41a (patch)
tree0982600b64bbb64b93f829cddcc4c03e00164097 /graph
parent85b31124a07fa30111bda10f2ed958420f7ff575 (diff)
Update articulationPoints.cpp
fixed articulation points for disconnected graphs and automaticly set isArt for roots
Diffstat (limited to 'graph')
-rw-r--r--graph/articulationPoints.cpp20
1 files changed, 12 insertions, 8 deletions
diff --git a/graph/articulationPoints.cpp b/graph/articulationPoints.cpp
index aa73486..460919d 100644
--- a/graph/articulationPoints.cpp
+++ b/graph/articulationPoints.cpp
@@ -1,13 +1,13 @@
// Laufzeit: O(|V|+|E|)
-vector< vector<int> > adjlist;
+vector<vector<int>> adjlist;
vector<bool> isArt;
vector<int> d, low;
-int counter, root; // root >= 2 <=> Wurzel Artikulationspunkt
+int counter, root, rootCount; // root >= 2 <=> Wurzel Artikulationspunkt
vector<ii> bridges; // Nur fuer Brücken.
-void dfs(int v, int parent) { // Mit parent=-1 aufrufen.
- d[v] = low[v] = counter++;
- if (parent == 0) root++;
+void dfs(int v, int parent = -1) {
+ d[v] = low[v] = ++counter;
+ if (parent == root) ++rootCount;
for (auto w : adjlist[v]) {
if (!d[w]) {
@@ -20,10 +20,14 @@ void dfs(int v, int parent) { // Mit parent=-1 aufrufen.
}}}
void findArticulationPoints() {
- counter = 1; // Nicht auf 0 setzen!
+ counter = 0;
low.resize(adjlist.size());
d.assign(adjlist.size(), 0);
isArtPoint.assign(adjlist.size(), false);
bridges.clear(); //nur fuer Bruecken
- for (int v = 0; v < (int)adjlist.size(); v++) if (!d[v]) dfs(v, -1);
-}
+ for (int v = 0; v < (int)adjlist.size(); v++) {
+ if (!d[v]) {
+ root = v; rootCount = 0;
+ dfs(v);
+ if (rootCount > 1) isArt[v] = true;
+}}}