hdu 2874 Connections between cities(LCA)

来源:互联网 发布:淘宝达人号出售 编辑:程序博客网 时间:2024/04/29 23:04


hdu 2874 Connections between cities


普通的LCA求最短距离,只不过此题存在不连通情况,并查集判断下


#include<cstdio>#include<cstring>#include<vector>using namespace std;#define MAXN 10005struct tnode{    int v,d;    tnode(int v=0,int d=0):v(v),d(d){}};struct qnode{    int v,id;    qnode(int v=0,int id=0):v(v),id(id){}};vector<tnode> t[MAXN];vector<qnode> q[MAXN];int dis[MAXN],fa[MAXN],con[MAXN],ans[1000005];int n,m;bool vis[MAXN];void ini(){    for(int i=0;i<=n;i++)    {        t[i].clear();        q[i].clear();        fa[i]=con[i]=i;        vis[i]=false;    }}int find(int x,int *f) {return x==f[x]?x:f[x]=find(f[x],f);}void setunion(int x,int y){    int fx=find(x,con),fy=find(y,con);    if(fx!=fy) con[fx]=fy;}void lca(int u){    vis[u]=true;    for(int i=0;i<q[u].size();i++)    {        int v=q[u][i].v;        if(vis[v])        {            if(find(u,con)!=find(v,con)) ans[q[u][i].id]=-1;            else ans[q[u][i].id]=dis[u]+dis[v]-2*dis[find(v,fa)];        }    }    for(int i=0;i<t[u].size();i++)    {        int v=t[u][i].v;        if(!vis[v])        {            dis[v]=dis[u]+t[u][i].d;            lca(v);            fa[v]=u;        }    }}int main(){    int x;    while(scanf("%d%d%d",&n,&x,&m)!=EOF)    {        ini();        int u,v,d;        while(x--)        {            scanf("%d%d%d",&u,&v,&d);            setunion(u, v);            t[u].push_back(tnode(v,d));            t[v].push_back(tnode(u,d));        }        for(int i=0;i<m;i++)        {            scanf("%d%d",&u,&v);            q[u].push_back(qnode(v,i));            q[v].push_back(qnode(u,i));        }        for(int i=1;i<=n;i++)            if(con[i]==i)            {                dis[i]=0;                lca(i);            }        for(int i=0;i<m;i++)            if(ans[i]==-1) printf("Not connected\n");        else            printf("%d\n",ans[i]);    }    return 0;}


0 0
原创粉丝点击