poj3417(LCA+DP)

Posted yijiull

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了poj3417(LCA+DP)相关的知识,希望对你有一定的参考价值。

题目连接:http://poj.org/problem?id=3417

tarjan+树DP

来自:http://www.cnblogs.com/scau20110726/archive/2013/05/31/3110666.html

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<algorithm>
  4 #include<cmath>
  5 using namespace std;
  6 const int N=100005;
  7 const int Q=100005;
  8 
  9 int te,tq;
 10 int heade[N],headq[N],dp[N],f[N],vis[N];
 11 struct edge
 12 {
 13     int u,v,nex;
 14 }e[N*2];
 15 
 16 struct query
 17 {
 18     int u,v,lca,nex;
 19 }q[Q*2];
 20 
 21 void adde(int u,int v)
 22 {
 23     e[te].v=v;
 24     e[te].u=u;
 25     e[te].nex=heade[u];
 26     heade[u]=te++;
 27 }
 28 void addq(int u,int v)
 29 {
 30     q[tq].u=u;
 31     q[tq].v=v;
 32     q[tq].lca=-1;
 33     q[tq].nex=headq[u];
 34     headq[u]=tq++;
 35 }
 36 int gf(int x)
 37 {
 38     return x==f[x]?x:f[x]=gf(f[x]);
 39 }
 40 
 41 void tarjan(int u)
 42 {
 43     vis[u]=1;
 44     for(int i=headq[u];i!=-1;i=q[i].nex)
 45         if(vis[q[i].v])
 46         {
 47             int v=q[i].v;
 48             int lca=gf(v);
 49             q[i].lca=q[i^1].lca=lca;
 50         }
 51     for(int i=heade[u];i!=-1;i=e[i].nex)
 52         if(!vis[e[i].v])
 53         {
 54             int v=e[i].v;
 55             tarjan(v);
 56             f[v]=u;
 57         }
 58 }
 59 
 60 void DP(int u)
 61 {
 62     vis[u]=1;
 63     for(int i=heade[u];i!=-1;i=e[i].nex)
 64         if(!vis[e[i].v])
 65         {
 66             int v=e[i].v;
 67             DP(v);
 68             dp[u]+=dp[v];
 69         }
 70 }
 71 int main()
 72 {
 73       int n,t;
 74 
 75       while(scanf("%d%d",&n,&t)!=EOF)
 76       {
 77           te=tq=0;
 78           memset(heade,-1,sizeof(heade));
 79           memset(headq,-1,sizeof(headq));
 80           memset(dp,0,sizeof(dp));
 81           memset(vis,0,sizeof(vis));
 82           for(int i=1;i<=n;i++) f[i]=i;
 83           for(int i=1;i<n;i++)
 84           {
 85               int u,v;
 86               scanf("%d%d",&u,&v);
 87               adde(u,v);
 88               adde(v,u);
 89           }
 90           for(int i=0;i<t;i++)
 91           {
 92               int u,v;
 93               scanf("%d%d",&u,&v);
 94               addq(u,v);
 95               addq(v,u);
 96               dp[u]++;
 97               dp[v]++;
 98           }
 99           tarjan(1);
100           for(int i=0;i<t;i++)
101           {
102               int s=i*2;
103               int lca=q[s].lca;
104               dp[lca]-=2;
105           }
106           memset(vis,0,sizeof(vis));
107           DP(1);
108           int res=0;
109           for(int i=2;i<=n;i++)
110               if(dp[i]==1) res++;
111                 else if(dp[i]==0) res+=t;
112           printf("%d\\n",res);
113 
114       }
115 }

 

以上是关于poj3417(LCA+DP)的主要内容,如果未能解决你的问题,请参考以下文章

Network POJ - 3417(LCA+dfs)

LCA目录

poj3417 暗的连锁

poj3417

暗的连锁 POJ3417

POJ3417Network