POJ-1986-Distance Queries

来源:互联网 发布:淘宝美工私活 编辑:程序博客网 时间:2024/06/05 09:16

这个题其实就是LCA的模板题。

代码:

#include<cstdio>#include<cstring>#include<iostream>#include<vector>using namespace std;const int maxn=1e5;const int maxm=5e5;int e,head[maxn],nxt[maxm],pnt[maxm],cost[maxm],p[maxn],dist[maxn];int n,m,k,ans[maxn];vector<pair<int,int> > query[maxn];bool vis[maxn];void AddEdge(int u,int v,int c){    pnt[e]=v;nxt[e]=head[u];cost[e]=c;head[u]=e++;}void Init(){    for(int i=1;i<=n;i++)        query[i].clear();}int find(int x){    if(p[x]==x)        return x;    return p[x]=find(p[x]);}void LCA(int u,int fa){    p[u]=u;    for(int i=head[u];i!=-1;i=nxt[i])    {        if(pnt[i]==fa)            continue;        dist[pnt[i]]=dist[u]+cost[i];        LCA(pnt[i],u);        p[pnt[i]]=u;    }    vis[u]=1;    for(int i=0;i<query[u].size();i++)    {        int v=query[u][i].first;        if(vis[v])            ans[query[u][i].second]=dist[u]+dist[v]-2*dist[find(v)];    }}int main(){    while(scanf("%d%d",&n,&m)!=EOF)    {        Init();        e=0;        memset(head,-1,sizeof(head));        for(int i=0;i<m;i++)        {            int u,v,c;            char str[5];            scanf("%d%d%d%s",&u,&v,&c,str);            AddEdge(u,v,c);            AddEdge(v,u,c);        }        scanf("%d",&k);        for(int i=0;i<k;i++)        {            int u,v;            scanf("%d%d",&u,&v);            query[u].push_back(make_pair(v,i));            query[v].push_back(make_pair(u,i));        }        LCA(1,-1);        for(int i=0;i<k;i++)            printf("%d\n",ans[i]);    }    return 0;}


0 0