HDU 4912 Paths on the tree

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

题意:给一棵树,再给一些路径,求最多有多少条路径不相交。

题解:主要是贪心的想法。用LCA处理出路径的层数,然后从最深处的节点往上找。因为节点越深,对其他路径影响度越小,相交的可能性越低。需要手动扩栈。

  1 #pragma comment(linker, "/STACK:1024000000,1024000000")
  2 #include <iostream>
  3 #include <cstring>
  4 #include <cstdio>
  5 #include <cstdlib>
  6 #include <cmath>
  7 #include <string>
  8 #include <vector>
  9 #include <list>
 10 #include <map>
 11 #include <queue>
 12 #include <stack>
 13 #include <bitset>
 14 #include <algorithm>
 15 #include <numeric>
 16 #include <functional>
 17 #include <set>
 18 #include <fstream>
 19 
 20 using namespace std;
 21 
 22 const int INF=0xfffffff;
 23 const int maxn=100010;
 24 
 25 struct edge
 26 {
 27     int v,next;
 28 }G[maxn*2];
 29 struct node
 30 {
 31     int u,v,id;
 32 }es[maxn];
 33 int head[maxn],idx;
 34 int LCA[maxn],par[maxn],d[maxn];
 35 bool used[maxn];
 36 int parent[maxn];
 37 int depth[maxn];
 38 vector<pair<int,int> >query[maxn];
 39 
 40 int find(int x)
 41 {
 42     return x==par[x]?x:par[x]=find(par[x]);
 43 }
 44 
 45 void build(int u,int v)
 46 {
 47     G[idx].v=v;
 48     G[idx].next=head[u];
 49     head[u]=idx++;
 50 }
 51 
 52 void add_edge(int u,int v)
 53 {
 54     build(u,v);
 55     build(v,u);
 56 }
 57 
 58 void dfs(int u,int root)
 59 {
 60     par[u]=u;
 61     pair<int,int>PI;
 62     for(int i=0;i<(int)query[u].size();i++)
 63     {
 64         PI=query[u][i];
 65         if(d[PI.first]==-1) continue;
 66         LCA[PI.second]=find(PI.first);
 67     }
 68     for(int k=head[u];k!=-1;k=G[k].next)
 69     {
 70         int v=G[k].v;
 71         if(v==root) continue;
 72         d[v]=d[u]+1;
 73         dfs(v,u);
 74         par[v]=u;
 75     }
 76 }
 77 
 78 bool cmp(node& a,node& b)
 79 {
 80     int u=LCA[a.id];
 81     int v=LCA[b.id];
 82     return d[u]>d[v];
 83 }
 84 
 85 void init(int n)
 86 {
 87     memset(used,0,sizeof(used));
 88     memset(head,-1,sizeof(head));
 89     idx=0;
 90     memset(d,-1,sizeof(d));
 91     for(int i=0;i<=n;i++) query[i].clear();
 92 }
 93 
 94 void dfs_res(int u)
 95 {
 96     used[u]=true;
 97     for(int k=head[u];k!=-1;k=G[k].next)
 98     {
 99         int v=G[k].v;
100         if(used[v]||d[v]<d[u]) continue;
101         dfs_res(v);
102     }
103 }
104 
105 int main()
106 {
107     //freopen("/Users/apple/Desktop/暑假/30/30/in","r",stdin);
108     int N,M;
109     while(scanf("%d%d",&N,&M)!=EOF)
110     {
111         init(N);
112         for(int i=1;i<N;i++)
113         {
114             int u,v;
115             scanf("%d%d",&u,&v);
116             add_edge(u,v);
117         }
118         for(int i=0;i<M;i++)
119         {
120             int u,v;
121             scanf("%d%d",&u,&v);
122             query[u].push_back(make_pair(v,i));
123             query[v].push_back(make_pair(u,i));
124             es[i].u=u;
125             es[i].v=v;
126             es[i].id=i;
127         }
128         d[1]=0;
129         dfs(1,-1);
130         sort(es,es+M,cmp);
131         int res=0;
132         for(int i=0;i<M;i++)
133         {
134             if(!used[es[i].u]&&!used[es[i].v])
135             {
136                 res++;
137                 dfs_res(LCA[es[i].id]);
138             }
139         }
140         printf("%d\n",res);
141     }
142     return 0;
143 }

 

posted @ 2014-08-07 09:35  Der_Z  阅读(321)  评论(0编辑  收藏  举报