zoukankan      html  css  js  c++  java
  • poj 2117 Electricity

    /*
    Tarjan求割点 
    */
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<stack>
    #define maxn 10010
    using namespace std;
    int n,m,num,head[maxn],low[maxn],dfn[maxn],f[maxn],father[maxn];
    int point[maxn],topt,sum;
    struct node{
        int v,pre;
    }e[maxn*200];
    stack<int>s;
    int init(){
        int x=0;char s=getchar();
        while(s<'0'||s>'9')s=getchar();
        while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}
        return x;
    }
    void Clear(){
        memset(head,-1,sizeof(head));
        memset(low,0,sizeof(low));
        memset(dfn,0,sizeof(dfn));
        memset(f,0,sizeof(f));
        memset(point,0,sizeof(point));
        num=topt=sum=0;
        while(!s.empty())s.pop();
    }
    void Add(int from,int to){
        e[num].v=to;
        e[num].pre=head[from];
        head[from]=num++;
    }
    void Tarjan(int x,int fa,int E){
        father[x]=fa;
        dfn[x]=low[x]=++topt;
        f[x]=1;s.push(x);
        int sc=0;
        for(int i=head[x];i!=-1;i=e[i].pre){
            int v=e[i].v;
            if(i==(E^1))continue;
            if(dfn[v]==0){
                sc++;
                Tarjan(v,x,i);low[x]=min(low[x],low[v]);
                if(low[v]>=dfn[x])point[x]++;
            }
            else if(f[v])low[x]=min(low[x],dfn[v]);
        }
        if(fa<0&&sc==1)point[x]=0;
        if(low[x]==dfn[x]){
            while(s.top()!=x){
                f[s.top()]=0;s.pop();
            }
            f[s.top()]=0;s.pop();
        }
    }
    void Init(){
        for(int i=1;i<=m;i++){
            int u,v;
            u=init();v=init();
            u++;v++;
            Add(u,v);Add(v,u);
        }
        for(int i=1;i<=n;i++)
            if(dfn[i]==0){
                sum++;Tarjan(i,-1,-1);
            }
    }
    void Solve(){
        int mxx=-100000;
        for(int u=1;u<=n;u++){
            if(father[u]==-1){
                point[u]--;
            }
            mxx=max(mxx,point[u]);
        }
        printf("%d
    ",sum+mxx);
    }
    int main()
    {
        while(1){
            n=init();m=init();
            if(n==0&&m==0)break;
            Clear();
            Init();
            Solve();
        }
    }
  • 相关阅读:
    Android仿人人客户端(v5.7.1)——个人主页(三)
    hdu2554-N对数的排列问题
    POJ1363:Rails
    golang printf
    HDU1200:To and Fro
    [C# 基础知识系列]专题六:泛型基础篇——为什么引入泛型
    poj 2480 (欧拉函数应用)
    Re:从0开始的微服务架构--(二)快速快速体验微服务架构?--转
    爬虫推荐的工具
    python2 与 python3 语法区别--转
  • 原文地址:https://www.cnblogs.com/yanlifneg/p/5839642.html
Copyright © 2011-2022 走看看