现在的位置: 首页 > 综合 > 正文

POJ 1144 Network 求割点个数

2014年09月05日 ⁄ 综合 ⁄ 共 984字 ⁄ 字号 评论关闭
View Code

#include<stdio.h>
#include<string.h>
#define maxn 110
#define maxm maxn * maxn
#define inf 1000000000

int min(int a, int b)
{
    return a < b ? a : b;
}

struct E
{
    int v, next;
}edge[maxm<<1];

int head[maxn], tot;
int n, m;

void add(int s, int t)
{
    edge[tot].v = t;
    edge[tot].next = head[s];
    head[s] = tot++;

    edge[tot].v = s;
    edge[tot].next = head[t];
    head[t] = tot++;
}

int low[maxn], dfn[maxn];
int sub[maxn];
int id;
void init()
{
    tot = 0;
    id = 0;
    memset(head, -1, sizeof(head));
    memset(dfn, 0, sizeof(dfn));
    memset(sub, 0, sizeof(sub));
}

void dfs(int u)
{
    low[u] = dfn[u] = ++id;
    int i, v;
    for(i = head[u]; i != -1; i = edge[i].next)
    {
        v = edge[i].v;
        if(!dfn[v])
        {
            dfs(v);
            low[u] = min(low[u], low[v]);
            if(low[v] >= dfn[u])
                sub[u]++;
        }
        else low[u] = min(low[u], dfn[v]);
    }
}    

char buf[303];
int main()
{
    int i, j;
    int x, y;
    int sum;
    while( ~scanf("%d", &n) && n)
    {
        init();
        while( ~scanf("%d", &x) && x)
        {
            gets(buf);
            sum = 0;
            int len = strlen(buf);
            buf[len] = ' '; 
            for(i = 0; i <= len; i++)
            {
                if(buf[i] == ' ') 
                {
                    if(i)add(x, sum);
                    sum = 0;
                }
                else
                    sum = sum * 10 + buf[i] - '0';
            }
        }
        dfs(1);
        if(sub[1] > 0) sub[1]--;
        int ans = 0;
        for(i = 1; i <= n; i++)
            if(sub[i]) ans++;
        printf("%d\n", ans);
    }
    return 0;
}

抱歉!评论已关闭.