zoukankan      html  css  js  c++  java
  • hdu 4612 双连通+树的直径

    图论还真心难搞,

    #pragma comment(linker, "/STACK:1024000000,1024000000")
    #include<iostream>
    #include<algorithm>
    #include<vector>
    using namespace std;
    const int N=200055;
    int dfn[N],low[N],belong[N],sta[N];
    vector<int> e[N],tree[N];
    int n,m,index,color,top;
    int dis[N];
    void init()
    {
        memset(dfn,0,sizeof(dfn));
        index=0;
        top=0;
        color=0;
        for(int i=0;i<=n;i++)
        {
            e[i].clear();
            tree[i].clear();
        }
    }
    int min(int a,int b)
    {
        if(a<b)
            return a;
        else
            return b;
    }
    void tarjan(int u,int fa)
    {
        dfn[u]=low[u]=++index;
        int flag=0;
        sta[++top]=u;
        for(int i=0;i<e[u].size();i++)
        {
            int v=e[u][i];
            if(!dfn[v])
            {
                tarjan(v,u);
                low[u]=min(low[u],low[v]);
            }else if(v==fa)
            {
                if(flag) low[u]=min(low[u],dfn[v]);
                flag++;
            } else low[u]=min(low[u],dfn[v]);
            
        }
        if(dfn[u]==low[u])
        {
            color++;
            int x;
            do
            {
                x=sta[top--];
                belong[x]=color;
            }while(x!=u);
        }
        
    }
    void buildtree()
    {
        for(int i=1;i<=n;i++)
        {
            for(int j=0;j<e[i].size();j++)
            {
                int v=e[i][j];
                if(belong[i]!=belong[v])
                {
                    tree[belong[i]].push_back(belong[v]);
                    tree[belong[v]].push_back(belong[i]);
                }
            }
        }
    }
    void dfs(int u)
    {
        for(int i=0;i<tree[u].size();i++)
        {
            int v=tree[u][i];
            if(dis[v]==-1)
            {
                dis[v]=dis[u]+1;
                dfs(v);
            }
        }
    }
    int main()
    {
        int a,b,i;
        while(scanf("%d%d",&n,&m),n+m)
        {
            init();
            for(i=0;i<m;i++)
            {
                scanf("%d%d",&a,&b);
                if(a==b)continue;
                e[a].push_back(b);
                e[b].push_back(a);
            }
            tarjan(1,-1);
            buildtree();
            memset(dis,-1,sizeof(dis));
            dis[1]=0;
            dfs(1);
            int k,max=-1;
            for(i=1;i<=color;i++)
            {
                if(dis[i]>max)
                {
                    max=dis[i];
                    k=i;
                }
            }
            memset(dis,-1,sizeof(dis));
            dis[k]=0;
            dfs(k);
            for(i=1;i<=color;i++)
            {
                if(dis[i]>max)
                    max=dis[i];
            }       
            
            printf("%d
    ",color-max-1);
        }
        return 0;
    }
  • 相关阅读:
    python基础学习文件内容的操作
    python基础学习字符串操作
    python基础学习运算符
    python基础学习列表
    centos一键安装nginx
    centos6添加整段多IP脚本
    Ubuntu 添加整段多IP脚本
    安装python2.7
    两位float型的小数相加,不会变成两位小时的处理方法
    mysql 5.7 执行group by 语句报错
  • 原文地址:https://www.cnblogs.com/BruceNoOne/p/3218092.html
Copyright © 2011-2022 走看看