POJ 1523 SPF 割点

来源:互联网 发布:移动数据不可用 编辑:程序博客网 时间:2024/05/01 07:26

题目链接

http://poj.org/problem?id=1523

题意

给定一图,问删除某个点后会出现几个连通块

思路

tarjan算法求出所有块,统计割点在几个块中出现过,即答案

#include<cstdio>#include<iostream>#include<algorithm>#include<cstring>#include<vector>#include<string>#include<queue>#include<stack>#include<set>#include<map>#define ll long longusing namespace std;const int INF = ( 2e9 ) + 2;const ll maxn = 1e3+10;struct edge{    int u,v,next;}e[maxn*maxn];int head[maxn];int tot;int dfn[maxn],low[maxn],cnt[maxn];int index;bool vis[maxn],cut[maxn];stack<edge> s;void add(int u,int v){    e[tot].u=u;    e[tot].v=v;    e[tot].next=head[u];    head[u]=tot++;}void init(){    memset(head,-1,sizeof(head));    tot=0;}void tarjan(int u,int fa){    dfn[u]=low[u]=++index;    int child=0;    for(int i=head[u];i!=-1;i=e[i].next)    {        int v=e[i].v;        if(v==fa)continue;        if(!dfn[v])        {            s.push(e[i]);            tarjan(v,u);            child++;            low[u]=min(low[u],low[v]);            if(low[v]>=dfn[u])            {                int x,y;                memset(vis,0,sizeof(vis));                while(!s.empty())                {                    edge temp=s.top();s.pop();                    x=temp.u,y=temp.v;                    if(!vis[x])cnt[x]++,vis[x]=1;                    if(!vis[y])cnt[y]++,vis[y]=1;                    if(x==u&&y==v)break;                }                cut[u]=true;            }        }        else if(dfn[v]<dfn[u])        {            low[u]=min(low[u],dfn[v]);            s.push(e[i]);        }    }    if(fa==-1)    {        if(child>1)        {            cut[u]=true;            cnt[u]=child;        }        else        {            cut[u]=false;        }    }}void solve(int n){    memset(dfn,0,sizeof(dfn));    memset(cut,0,sizeof(cut));    memset(cnt,0,sizeof(cnt));    index=0;    tarjan(1,-1);    int f=0;    for(int i=1;i<=n;i++)    {        if(cut[i])        printf("  SPF node %d leaves %d subnets\n",i,cnt[i]),f=1;    }    if(!f)    {        printf("  No SPF nodes\n");    }    puts("");}int main(){    int u,v,n,cas=0;    while(~scanf("%d",&u)&&u)    {        scanf("%d",&v);        init();        add(u,v);        add(v,u);        n=max(u,v);        while(scanf("%d",&u)&&(u))        {            scanf("%d",&v);            add(u,v);            add(v,u);            n=max(n,max(u,v));        }        printf("Network #%d\n",++cas);        solve(n);    }}
原创粉丝点击