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\n",color-max-1);
    }
    return 0;
}

 

posted on 2013-07-26 21:31  黎昊明  阅读(211)  评论(1编辑  收藏  举报

导航