POJ 1523 SPF(无向图求割点,去割点形成子图数)

来源:互联网 发布:淘宝充值未到账怎么办 编辑:程序博客网 时间:2024/05/17 08:07

题目链接:http://poj.org/problem?id=1523

#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>using namespace std;const int N = 1010;int edge[N][N];int n, son;int subnet[N], dfn[N], low[N], tmpdfn;bool vis[N];void init(){    tmpdfn = 1;    son = 0;    memset(dfn,0,sizeof(dfn));    memset(low,0,sizeof(low));    memset(vis,0,sizeof(vis));    memset(subnet,0,sizeof(subnet));    low[1] = dfn[1] = 1;    vis[1] = true;}void dfs(int u){    for(int v = 1; v <= n; v++)    {        if( edge[u][v] )        {            if( !vis[v] )            {                vis[v] = true;                dfn[v] = low[v] = ++tmpdfn;                dfs( v );                low[u] = min( low[u], low[v] );                if( low[v] >= dfn[u] )                {                    if( u != 1 ) subnet[u]++;                    else son++;                }            }            else low[u] = min( low[u], dfn[v] );        }    }}int main(){    int Case = 0;    while( 1 )    {        int u, v;        n = 0;        scanf("%d", &u);        if( u == 0 ) break;        memset(edge,0,sizeof(edge));        scanf("%d",&v);        if( u > n ) n = u;        if( v > n ) n = v;        edge[u][v] = edge[v][u] = 1;        while(1)        {            scanf("%d",&u);            if( u == 0 ) break;            scanf("%d",&v);            if(u > n) n = u;            if(v > n) n = v;            edge[u][v] = edge[v][u] = 1;        }        if( Case ) puts("");        printf("Network #%d\n", ++Case);        init();        dfs(1);        if( son > 1 ) subnet[1] = son-1;        bool find = false;        for(int i = 1; i <= n; i++)        {            if( subnet[i] )            {                find = true;                printf("  SPF node %d leaves %d subnets\n", i, subnet[i]+1);            }        }        if( !find ) printf("  No SPF nodes\n");    }    return 0;}
0 0
原创粉丝点击