UVA 315 Network (割点)

来源:互联网 发布:网络感情骗术 台湾 编辑:程序博客网 时间:2024/06/04 23:36

计算割点的个数

#include<iostream>#include<math.h>#include<stdio.h>#include<algorithm>#include<string.h>#include<vector>#include<queue>#include<map>#include<set>using namespace std;#define B(x) (1<<(x))typedef long long ll;void cmax(int& a,int b){ if(b>a)a=b; }void cmin(int& a,int b){ if(b<a)a=b; }const int oo=0x3f3f3f3f;const int MOD=1000000007;const int maxn=10005;const int maxm=110000;struct EDGE{    int v,next,c,f;}E[maxm];int head[maxn],tol;int low[maxn],dfn[maxn];int iscut[maxn];int g_cnt;void Init(){    memset(head,-1,sizeof head);    tol=0;    memset(low,0,sizeof low);    memset(dfn,0,sizeof dfn);    memset(iscut,0,sizeof iscut);    g_cnt=0;}void add_edge(int u,int v){    E[tol].v=v;    E[tol].next=head[u];    head[u]=tol++;}void Tarjan(int u,int pre){    dfn[u]=low[u]=++g_cnt;    int son=0;    for(int i=head[u];i!=-1;i=E[i].next){        int v=E[i].v;        if(v==pre)continue;        if(!dfn[v]){            son++;            Tarjan(v,u);            if(low[v]<low[u])                low[u]=low[v];            if(u!=pre&&low[v]>=dfn[u]){                iscut[u]=1;            }        }else if(dfn[v]<low[u])            low[u]=dfn[v];    }    if(u==pre&&son>1)iscut[u]=1;}int main(){    //freopen("E:\\read.txt","r",stdin);    int n,u,v;    char c;    while(scanf("%d",&n)!=EOF){        if(n==0)break;        Init();        while(scanf("%d",&u)&&u){            while(scanf("%d%c",&v,&c)){                add_edge(u,v);                add_edge(v,u);                if(c=='\n')break;            }        }        for(int i=1;i<=n;i++)            if(!dfn[i])                Tarjan(i,i);        int ans=0;        for(int i=1;i<=n;i++)            ans+=iscut[i];        printf("%d\n",ans);    }    return 0;}/*42 1 22 1 22 2 32 3 41 2 3 4*/


0 0