hdu2586 lca模板(tarjan离线算法)

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<algorithm>
 4 #include<vector>
 5 using namespace std;
 6 struct dian{
 7     int v,id;
 8 };
 9 int now;
10 vector<dian>mp[100005];
11 int vis[100005],next[200005],head[200005],point[200005],value[200005],father[100005];
12 int num[100005][3],dis[100005];
13 void add(int u,int v,int w)
14 {
15     next[++now]=head[u];
16     head[u]=now;
17     point[now]=v;
18     value[now]=w;
19 }
20 int findf(int x)
21 {
22     if (x!=father[x]) father[x]=findf(father[x]);
23     return father[x];
24 }
25 void tarjan(int u)
26 {
27     int i,v,id,w;
28     vis[u]=1;
29     for (i=0;i<mp[u].size();i++)
30     {
31         v=mp[u][i].v; id=mp[u][i].id;
32         if (vis[v]) num[id][2]=findf(v);
33     }
34     for (i=head[u];i!=-1;i=next[i])
35     {
36         v=point[i]; w=value[i];
37         if (!vis[v])
38         {
39             dis[v]=dis[u]+w;
40             tarjan(v);
41             father[v]=u;
42         }
43     }
44     return;
45 }
46 int main()
47 {
48     int T,i,x,y,w,n,m;
49     dian n1,n2;
50     scanf("%d",&T);
51     while (T--)
52     {
53         scanf("%d%d",&n,&m);
54         now=0;
55         memset(vis,0,sizeof(vis));
56         memset(dis,0,sizeof(dis));
57         memset(head,-1,sizeof(head));
58         for (i=1;i<n;i++)
59         {
60             scanf("%d%d%d",&x,&y,&w);
61             add(x,y,w); add(y,x,w);
62         }
63         for (i=1;i<=m;i++)
64         {
65             scanf("%d%d",&x,&y);
66             num[i][0]=x; num[i][1]=y;
67             n1.v=y; n1.id=i;
68             mp[x].push_back(n1);
69             n1.v=x; n1.id=i;
70             mp[y].push_back(n1);
71         }
72         for (i=1;i<=n;i++) father[i]=i;
73         tarjan(1);
74         for (i=1;i<=m;i++)
75             printf("%d\n",dis[num[i][0]]+dis[num[i][1]]-2*dis[num[i][2]]);
76     }
77     return 0;
78 }

http://acm.hdu.edu.cn/showproblem.php?pid=2586

posted on 2014-09-30 21:26  xiao_xin  阅读(133)  评论(0编辑  收藏  举报

导航