Punkty Artykulacji I Mosty
Algorytm może wielokrotnie wypisanić ten sam punk artylulacji.
Można dodać tablicę bool i zapamiętywać czy punkt jest punktem artylulacji aby uniknąć powtórzeń.
#include <algorithm> #include <vector> #include <cstdio> using namespace std; const int NIES = 1000000000; vector<vector<int> > graf; int czas; vector<bool> odwiedzony; vector<int> ojciec; vector<int> numer; vector<int> low; void dfs_visit (int s) { odwiedzony[s] = true; numer[s] = low[s] = ++czas; for (vector<int>::const_iterator i = graf[s].begin() ; i != graf[s].end() ; ++i) { if (!odwiedzony[*i]) { ojciec[*i] = s; dfs_visit(*i); if (low[*i] >= numer[s]) printf("Punkt arytkulacji %d\n", s); low[s] = min(low[s], low[*i]); } else if (ojciec[s] != *i) { low[s] = min(low[s], numer[*i]); } } if (low[s] == numer[s]) printf("Most %d %d\n", s, ojciec[s]); } void dfs_visit_root (int s) { int ile = 0; // ilość dzieci korzenia odwiedzony[s] = true; numer[s] = low[s] = ++czas; for (vector<int>::const_iterator i = graf[s].begin() ; i != graf[s].end() ; ++i) { if (!odwiedzony[*i]) { ++ile; ojciec[*i] = s; dfs_visit(*i); if (ile >= 2) printf("Punkt arytkulacji %d\n", s); low[s] = min(low[s], low[*i]); } else if (ojciec[*i] != s) { low[s] = min(low[*i], numer[s]); } } } void dfs () { czas = 0; odwiedzony.assign(graf.size(), false); ojciec.assign(graf.size(), NIES); numer.clear(); numer.resize(graf.size()); low.clear(); low.resize(graf.size()); for (int i = 0 ; i < (int)graf.size() ; ++i) { if (!odwiedzony[i]) dfs_visit_root(i); } } void test () { int n, m, a, b; scanf("%d%d", &n, &m); graf.clear(); graf.resize(n); for (int i = 0 ; i < m ; ++i) { scanf("%d%d", &a, &b); graf[a].push_back(b); graf[b].push_back(a); } dfs(); } int main () { test(); return 0; }
wersja strony: 2, ostatnia edycja: 27 Jan 2010 21:58