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;
}
O ile nie zaznaczono inaczej, treść tej strony objęta jest licencją Creative Commons Attribution-ShareAlike 3.0 License