POJ 1523 SPF【割点】

来源:互联网 发布:先锋软件学院怎么样 编辑:程序博客网 时间:2024/05/01 12:29

刻意选取了割点的题来做


题意:要找到题中的所有的割点,然后如果删去割点,可以把全图分成几个部分

就是使用割点模板

关键是题目中的输入输出处理比较麻烦,要注意好细节


#include<iostream>#include<cstdio>#include<stdio.h>#include<cstdlib>#include<stdlib.h>#include<algorithm>#include<string.h>#include<cstring>using namespace std;const int maxn=1010;const int maxm=10010;struct Edge{    int to,nxt;    bool cut;}edge[maxm];int head[maxn],tot;int Low[maxn],DFN[maxn],Stack[maxn];int Index,top,block;bool Instack[maxn];bool cut[maxn];int add_block[maxn];int bridge;void addedge(int u,int v){    edge[tot].to=v;    edge[tot].nxt=head[u];    edge[tot].cut=false;    head[u]=tot++;}void Tarjan(int u,int pre){    int v;    Low[u]=DFN[u]=++Index;    Stack[top++]=u;    Instack[u]=true;    int son=0;    int pre_cnt=0;    for(int i=head[u];i!=-1;i=edge[i].nxt){        v=edge[i].to;        if (v==pre&&pre_cnt==0){            pre_cnt++;            continue;        }        if (!DFN[v]){            son++;            Tarjan(v,u);            if (Low[u]>Low[v]) Low[u]=Low[v];            if (Low[v]>DFN[u]){                bridge++;                edge[i].cut=true;                edge[i^1].cut=true;            }            if (u!=pre&&Low[v]>=DFN[u]){                cut[u]=true;                add_block[u]++;            }        }        else if (Low[u]>DFN[v])            Low[u]=DFN[v];    }    if (u==pre&&son>1) cut[u]=true;    if (u==pre) add_block[u]=son-1;    Instack[u]=false;    top--;}void init(){    memset(DFN,0,sizeof(DFN));    memset(Instack,0,sizeof(Instack));    memset(add_block,0,sizeof(add_block));    memset(cut,false,sizeof(cut));    memset(head,-1,sizeof(head));    Index=top=0;tot=0;}int main(){    //freopen("input.txt","r",stdin);    int u,v,n,Case=0;    while(scanf("%d",&u)!=EOF){        if (u==0) break;        init();n=0;        while(u!=0){            scanf("%d",&v);            addedge(u,v);            addedge(v,u);            n=max(n,u);            n=max(n,v);            scanf("%d",&u);        }        int cnt=0;        for(int i=1;i<=n;i++)        if (!DFN[i]){            Tarjan(i,i);            cnt++;        }        printf("Network #%d\n",++Case);        int num=0;        for(int i=1;i<=n;i++)            if (cut[i]) num++;        if (num==0)            puts("  No SPF nodes");        else{            for(int i=1;i<=n;i++)                if (cut[i])                    printf("  SPF node %d leaves %d subnets\n",i,1+add_block[i]);        }        puts("");    }    return 0;}


0 0