首页 > 代码库 > HDU 4912 Paths on the tree
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 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。