HDU 2586

来源:互联网 发布:一苇渡江网络培训 编辑:程序博客网 时间:2024/05/03 19:14

O 点击打开链接 离线做法,倍增法还不会

#include<stdio.h>#include<string.h>#include<stack>#include<string>#include<math.h>#include<queue>#include<set>#include<algorithm>#include<iostream>#include<vector>#include<map>using namespace std;#define LL long long#define inf 199999999#define N 40010int ehead[N],qhead[N],dis[N],f[N],ans[220];bool vis[N];struct node{    int v,next,w;}edge[N*2];struct Query{    int num,v,next;}query[220];int e,qe;void adde(int u,int v,int w){    edge[e].v=v;    edge[e].w=w;    edge[e].next=ehead[u];    ehead[u]=e++;}void addq(int u,int v,int num){query[qe].v=v;query[qe].num=num;query[qe].next=qhead[u];qhead[u]=qe++;}int find(int x){if(x!=f[x]) f[x]=find(f[x]);return f[x];}void Union(int u,int v){int fu=find(u);int fv=find(v);if(fv!=fu) f[fv]=fu;}void tarjan(int u,int d){    int i,v;    vis[u]=1;dis[u]=d;    for(i=ehead[u];i!=-1;i=edge[i].next)    {        v=edge[i].v;        if(vis[v]) continue;        tarjan(v,d+edge[i].w);        Union(u,v);    }    for(i=qhead[u];i!=-1;i=query[i].next)    {        v=query[i].v;        if(vis[v])            ans[query[i].num]=dis[u]+dis[v]-2*dis[find(v)];    }}int main(){    int i,j,n,m,t,u,v,w;    scanf("%d",&t);    while(t--)    {        scanf("%d%d",&n,&m);        qe=e=0;memset(dis,0,sizeof(dis));memset(vis,0,sizeof(vis));memset(ehead,-1,sizeof(ehead));memset(qhead,-1,sizeof(qhead));for(i=1;i<=n;i++)f[i]=i;        for(i=1;i<n;i++)        {            scanf("%d%d%d",&u,&v,&w);            adde(u,v,w);            adde(v,u,w);        }        for(i=1;i<=m;i++){scanf("%d%d",&u,&v);addq(u,v,i);addq(v,u,i);}tarjan(1,0);for(i=1;i<=m;i++)            printf("%d\n",ans[i]);    }    return 0;}

0 0
原创粉丝点击