hdu2874 Connections between cities(LCA,并查集同时判断连通)

求任意两点之间的最短距离,不连通的话输出不连通。

#include <stdio.h>
#include <string.h>
#include <vector>

 

using namespace std;

 

#define MAXN 10001
#define MAXQ 1000000

 

int N,bcnt,father[MAXN],ance[MAXN],dis[MAXN],res[MAXQ];

 

struct ENode
{
    int adv,dis;
};
struct QNode
{
    int adv,idx;
};

vector<ENode> adjlist[MAXN];
vector<QNode> query[MAXN];

bool visited[MAXN];
int color[MAXN];

int find_mfs(int x)
{
    int i,t;
    for(i=x;father[i]>0;i=father[i]) ;
    while(x!=i)
    {
        t=father[x];
        father[x]=i;
        x=t;
    }
    return i;
}
void merge_mfs(int x,int y)
{
    int fx,fy;
    fx=find_mfs(x);
    fy=find_mfs(y);
    if(fx==fy) return;
    if(father[fx]>father[fy]) //-3>-4
    {
        father[fy]+=father[fx];
        father[fx]=fy;
    }
    else
    {
        father[fx]+=father[fy];
        father[fy]=fx;
    }
}

void lca_tarjan(int u,int d)
{
  //  father[u]=-1;
    ance[u]=u;
    visited[u]=true;
    dis[u]=d;
    for(size_t j=0;j<adjlist[u].size();j++)
    {
        int v=adjlist[u][j].adv;
        if(!visited[v])
        {
            lca_tarjan(v,d+adjlist[u][j].dis);
            merge_mfs(u,v);
            ance[find_mfs(u)]=u;
        }
    }
    color[u]=bcnt;
    for(size_t k=0;k<query[u].size();k++)
    {
        int w=query[u][k].adv;
        if(color[w])
        {
            if(color[w]==bcnt)
            {
                int x=ance[ find_mfs(w) ];
                res[query[u][k].idx]=dis[u]+dis[w]-2*dis[x];
            }
            else res[ query[u][k].idx ]=-1;
        }
    }
}

int main()
{
    int M,Q,i,j,k,d;
    ENode e;
    QNode q;
    while(scanf("%d %d %d",&N,&M,&Q)!=EOF)
    {
        for(i=1;i<=N;i++)
        {
            father[i]=-1;
            visited[i]=false;
            color[i]=0;
            adjlist[i].clear();
            query[i].clear();
        }
        for(k=0;k<M;k++)
        {
            scanf("%d %d %d",&i,&j,&d);
            e.adv=j;
            e.dis=d;
            adjlist[i].push_back(e);
            e.adv=i;
            adjlist[j].push_back(e);
        }
        for(k=0;k<Q;k++)
        {
            scanf("%d %d",&i,&j);
            q.adv=j;
            q.idx=k;
            query[i].push_back(q);
            q.adv=i;
            query[j].push_back(q);
        }
        bcnt=0;
        for(i=1;i<=N;i++)
            if(!visited[i])
            {
                bcnt++;
                lca_tarjan(i,0);
            }
        for(k=0;k<Q;k++)
        {
            if(res[k]!=-1) printf("%d\n",res[k]);
            else printf("Not connected\n");
        }
    }
    return 0;
}

 

posted @ 2010-08-20 01:01  菜到不得鸟  阅读(552)  评论(0)    收藏  举报