hiho 52 連通性一·割邊與割點

問題

http://hihocoder.com/problemset/problem/1183?sid=785036

解法

Tarjan算法
這裏寫圖片描述

#include <bits/stdc++.h>
using namespace std;
enum{maxn = 20000+5};
vector<int> G[maxn];
int visit[maxn];
int low[maxn];
int dfn[maxn];
int parent[maxn];
int n;
set<int> points;
struct E{
    int u, v;
    E(int a, int b)
    {
        u = min(a, b);
        v = max(a, b);
    }
    bool operator<(const E& e) const
    {
        return u==e.u? (v<e.v): u<e.u;
    }
};
set<E> edges;
void dfs(int u)
{
    static int count = 0;
    int children =0;

    visit[u] = true;
    dfn[u] = low[u] = ++count;

    for (int i=0; i< G[u].size(); ++i)
    {
        int v = G[u][i];

        if (!visit[v])
        {
            ++children;
            parent[v] = u;
            dfs(v);
            low[u] = min(low[u], low[v]);

            if (parent[u] == 0 && children> 1)
                points.insert(u);
            if (parent[u] && low[v] >= dfn[u])
                points.insert(u);
            if (low[v] > dfn[u])
                edges.insert(E(u, v));
        }else{
            if (v != parent[u])
                low[u] = min(low[u], dfn[v]);
        }
    }
}
int main()
{
    int m;
    scanf("%d %d", &n, &m);
    int a, b;
    for (int i=0; i<m;++i)
    {
        scanf("%d %d", &a, &b);
        G[a].push_back(b);
        G[b].push_back(a);
    }
    memset(visit, 0, sizeof(visit));
    memset(parent, 0, sizeof(parent));
    dfs(a);

    for (auto i = points.begin(); i!= points.end(); ++i)
    {
        printf("%d ", *i);
    }
    if (points.empty())
        printf("Null");
    putchar('\n');
    for (auto i = edges.begin(); i!= edges.end(); ++i)
        printf("%d %d\n", i->u, i->v);
    return 0;
}
發佈了107 篇原創文章 · 獲贊 3 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章