zoukankan      html  css  js  c++  java
  • UVA 315 求连通图里的割点

    http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=20837

    哎 大白书里求割点的模板不好用啊,许多细节理解起来也好烦。。还好找了另一份模板

    请注意,这道题里的每组数据都是只有一组连通图的

    #include <iostream>
    #include <cstdio>
    #include <vector>
    #include <cstring>
    using namespace std;
    const int N = 111;
    vector<int> g[N];
    int n, low[N], dfn[N], f[N];
    bool vis[N];
    
    void dfs(int u, int depth, const int &root) { //root为连通图的树根
        dfn[u] = low[u] = depth;
        vis[u] = true;
        int cnt = 0;
        for (int i=0; i<g[u].size(); i++) {
            int v = g[u][i];
            if (!vis[v]) {
                cnt++;
                dfs(v, depth+1, root);
                low[u] = min(low[u], low[v]);
                if (u!=root && low[v]>=dfn[u]) f[u]++;   //当u不为树根的时候
                if (u==root && cnt>=2) f[u]++;           //当u为搜索树的树根的时候
            } else low[u] = min(low[u], dfn[v]);
        }
    }
    
    int cut_point() {
        dfs(1, 1, 1);
        int ans = 0;
        for (int i=1; i<=n; i++) if (f[i] >= 1) ans++;
        return ans;
    }
    void init() {
        memset(f, 0, sizeof(f));
        memset(vis, false, sizeof(vis));
        for(int i = 0;i < N;++i) g[i].clear();
    }
    int main() {
        while(scanf("%d",&n)&&n) {
            init();
            int start,v;
            while(scanf("%d",&start)&&start) {
                while(getchar()!='
    ') {
                    scanf("%d",&v);
                    g[start].push_back(v);
                    g[v].push_back(start);
                }
            }
            printf("%d
    ",cut_point());
        }
        return 0;
    }
  • 相关阅读:
    弹出窗口,关闭窗口刷新
    小知识
    将datatable转换为model
    根据空格换行
    获取和赋值checkbox,radiobutton,页面所有控件只读
    repater列求和
    internet 协议入门
    Django URL name详解
    Django 视图与网址进阶
    Django视图与网址
  • 原文地址:https://www.cnblogs.com/jusonalien/p/4149757.html
Copyright © 2011-2022 走看看