compro-library

This documentation is automatically generated by online-judge-tools/verification-helper

View the Project on GitHub ningenMe/compro-library

:warning: non-verified/LowLink.cpp

Code

class LowLink{
private:
    int N,inc;
    vector<int> ord,low;
public:
    vector<vector<int>> edge;
    vector<int> articulation;
    vector<pair<int,int>> bridge;

    LowLink(int N) : N(N),edge(N),ord(N,-1),low(N,0) {
        // do nothing
    }
    void make_edge(int from, int to) {
		edge[from].push_back(to);
	}
    void solve() {
        inc = 0;
        for(int i = 0; i < N; ++i) if(ord[i]==-1) dfs(i,-1);
    }
private:
    void dfs(int curr,int prev) {
        ord[curr] = inc++;
        low[curr] = ord[curr];
        int isArticulation = 0;
        int cnt = 0;
        for(int next:edge[curr]) {
            if(next == prev) continue;
            if(ord[next]==-1){
                cnt++;
                dfs(next,curr);
                low[curr] = min(low[curr],low[next]);
                if(prev != -1 && low[next] >= ord[curr]) isArticulation = 1;
                if(ord[curr]<low[next]) {
                    bridge.push_back({curr,next});
                    bridge.push_back({next,curr});
                }
            }
            else{
                low[curr] = min(low[curr],ord[next]);
            }
        }
        if(prev==-1 && cnt>1) isArticulation = 1;
        if(isArticulation) articulation.push_back(curr);
    }
};

//verify https://atcoder.jp/contests/arc039/tasks/arc039_d
#line 1 "non-verified/LowLink.cpp"

class LowLink{
private:
    int N,inc;
    vector<int> ord,low;
public:
    vector<vector<int>> edge;
    vector<int> articulation;
    vector<pair<int,int>> bridge;

    LowLink(int N) : N(N),edge(N),ord(N,-1),low(N,0) {
        // do nothing
    }
    void make_edge(int from, int to) {
		edge[from].push_back(to);
	}
    void solve() {
        inc = 0;
        for(int i = 0; i < N; ++i) if(ord[i]==-1) dfs(i,-1);
    }
private:
    void dfs(int curr,int prev) {
        ord[curr] = inc++;
        low[curr] = ord[curr];
        int isArticulation = 0;
        int cnt = 0;
        for(int next:edge[curr]) {
            if(next == prev) continue;
            if(ord[next]==-1){
                cnt++;
                dfs(next,curr);
                low[curr] = min(low[curr],low[next]);
                if(prev != -1 && low[next] >= ord[curr]) isArticulation = 1;
                if(ord[curr]<low[next]) {
                    bridge.push_back({curr,next});
                    bridge.push_back({next,curr});
                }
            }
            else{
                low[curr] = min(low[curr],ord[next]);
            }
        }
        if(prev==-1 && cnt>1) isArticulation = 1;
        if(isArticulation) articulation.push_back(curr);
    }
};

//verify https://atcoder.jp/contests/arc039/tasks/arc039_d
Back to top page