hdu 2586 How far away ?(LCA:最近公共祖先)

来源:互联网 发布:西服面料 知乎 编辑:程序博客网 时间:2024/05/14 03:16

题目:

        链接:点击打开链接

题意:

        

思路:

        

代码:

#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int N = 40040;const int M = 220;struct node{    int from;    int to;    int next;    int val;}edge[2*N];struct node1{    int from;    int to;    int next;    int num;}edge1[2*M];int tol,head[N],head1[N],tol1;int father[N],dis[N],LCA[M];int n,m;int vis[N];void add(int u,int v,int w){    edge[tol].from = u;    edge[tol].to = v;    edge[tol].next = head[u];    edge[tol].val = w;    head[u] = tol++;}void add1(int u,int v,int w){    edge1[tol1].from = u;    edge1[tol1].to = v;    edge1[tol1].next = head1[u];    edge1[tol1].num = w;    head1[u] = tol1++;}int findset(int x){    return father[x] == x ? x : father[x] = findset(father[x]);}void Tarjan(int u){    int v;    vis[u] = 1;    father[u] = u;    for(int j=head1[u]; j!=-1; j=edge1[j].next)    {        v = edge1[j].to;        if(vis[v])            LCA[edge1[j].num] = findset(v);    }    for(int j=head[u]; j!=-1; j=edge[j].next)    {        v = edge[j].to;        if(!vis[v])        {            dis[v] = dis[u] + edge[j].val;            Tarjan(v);            father[v] = u;        }    }}void init(){    tol = 0;    tol1 = 0;    dis[1] = 0;    memset(head,-1,sizeof(head));    memset(head1,-1,sizeof(head1));    memset(vis,0,sizeof(vis));}int main(){    //freopen("input.txt","r",stdin);    int t;    int a,b,c;    cin>>t;    while(t--)    {        init();        scanf("%d%d",&n,&m);        for(int i=1; i<n; i++)        {            scanf("%d%d%d",&a,&b,&c);            add(a,b,c);            add(b,a,c);        }        for(int i=1; i<=m; i++)        {            scanf("%d%d",&a,&b);            add1(a,b,i);            add1(b,a,i);        }        Tarjan(1);        for(int i=0; i<tol1; i+=2)        {            a = edge1[i].from;            b = edge1[i].to;            c = edge1[i].num;            printf("%d\n",dis[a] + dis[b] - 2*dis[LCA[c]]);        }    }    return 0;}

--------------------------------------------------------------------

战斗,从不退缩;奋斗,永不停歇~~~~~~~~~~~~~

0 0
原创粉丝点击