hdu--4912--终于解脱了

....历经n发wa之后 终于解脱了

这感觉....无法言表...

其实 这题你说难吧? 对于我而言 一共就做过一道lca的人来说 是有点难的

可是吧 当你慢慢地写下来 其实代码那么长 又不怎么难

对于此题 就是先求出query中2个结点的lca之后 然后dfs它们的lca 根据深度进行排序

这个其实不难理解吧? 当然深度越大的 就是离根结点越远 首先进行搜索

然后 就是每搜到一个点 就将它进行标记-已访问过

深搜的时候 注意下 不仅要判断是否访问过 而且要判断这2点的深度关系 肯定是从小的搜到大的

最最注意的就是

depth[v] = depth[u] + 1这句话 不要太随意地写在了lca_tarjan(v)的后面

表示 我就一不留神 写错了 找了好久。。

其余的 就是可以再去好好思索下lca_tarjan的整个算法实现过程

准备 可能 晚上再去学校lca的在线算法...

  1 #include <iostream>
  2 #include <cstring>
  3 #include <algorithm>
  4 using namespace std;
  5
  6 int Ncnt , Qcnt;
  7 const int size = 100010;
  8 struct data
  9 {
 10     int id;
 11     int from;
 12     int to;
 13     int next;
 14     int lca;
 15 };
 16 data node[size*2];
 17 int Nhead[size];
 18 data query[size*2];
 19 data graph[size];
 20 int Qhead[size];
 21 bool vis[size];
 22 int father[size];
 23 int depth[size];
 24 bool check[size];
 25
 26 bool cmp( data p , data q )
 27 {
 28     return depth[p.lca] > depth[q.lca];
 29 }
 30
 31 void init( )
 32 {
 33     memset( Nhead , -1 , sizeof(Nhead) );
 34     memset( Qhead , -1 , sizeof(Qhead) );
 35     memset( vis , false , sizeof(vis) );
 36     memset( check , false , sizeof(check) );
 37     depth[1] = 0;
 38 }
 39
 40 int find( int x )
 41 {
 42     return x == father[x] ? x : father[x] = find( father[x] );
 43 }
 44
 45 void addNedge( int st , int end )
 46 {
 47     node[Ncnt].to = end;
 48     node[Ncnt].next = Nhead[st];
 49     Nhead[st] = Ncnt ++;
 50 }
 51
 52 void addQedge( int id , int st , int end )
 53 {
 54     query[Qcnt].id = id;
 55     query[Qcnt].from = st;
 56     query[Qcnt].to = end;
 57     query[Qcnt].next = Qhead[st];
 58     Qhead[st] = Qcnt ++;
 59 }
 60
 61 void lca_tarjan( int u )
 62 {
 63     int v;
 64     father[u] = u;
 65     vis[u] = true;
 66     for( int i = Nhead[u] ; ~i ; i = node[i].next )
 67     {
 68         v = node[i].to;
 69         if( !vis[v] )
 70         {
 71             depth[v] = depth[u] + 1;
 72             lca_tarjan( v );
 73             father[v] = u;
 74         }
 75     }
 76     for( int i = Qhead[u] ; ~i ; i = query[i].next )
 77     {
 78         v = query[i].to;
 79         if( vis[v] )
 80         {
 81             graph[ query[i].id ].lca = find(v);
 82         }
 83     }
 84 }
 85
 86 void dfs( int u )
 87 {
 88     int v;
 89     check[u] = true;
 90     for( int i = Nhead[u] ; ~i ; i = node[i].next )
 91     {
 92         v = node[i].to;
 93         if( !check[v] && depth[u]<depth[v] )
 94             dfs(v);
 95     }
 96 }
 97
 98 int main()
 99 {
100     cin.sync_with_stdio(false);
101     int n , m , st , end , lca , ans , temp;
102     while( cin >> n >> m )
103     {
104         ans = Ncnt = Qcnt = 0;
105         init( );
106         for( int i = 0 ; i<n-1 ; i++ )
107         {
108             cin >> st >> end;
109             addNedge( st , end );
110             addNedge( end , st );
111         }
112         for( int i = 0 ; i<m ; i++ )
113         {
114             cin >> st >> end;
115             addQedge( i , st , end );
116             addQedge( i , end , st );
117             graph[i].from = st;
118             graph[i].to = end;
119         }
120         lca_tarjan(1);
121         sort( graph , graph+m , cmp );
122         for( int i = 0 ; i<m ; i++ )
123         {
124             st = graph[i].from;
125             end = graph[i].to;
126             lca = graph[i].lca;
127             if( !check[st] && !check[end] )
128             {
129                 ans ++;
130                 dfs( lca );
131             }
132         }
133         cout << ans << endl;
134     }
135     return 0;
136 }

today:

  关于思念你的这件小事

  躲得过对酒当歌的夜晚

  躲不过四下无人的街道

时间: 2024-10-07 13:09:56

hdu--4912--终于解脱了的相关文章

HDU 4912 LCA+贪心

Paths on the tree Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 531    Accepted Submission(s): 182 Problem Description bobo has a tree, whose vertices are conveniently labeled by 1,2,…,n. Th

hdu 4912 Paths on the tree(树链剖分+贪心)

题目链接:hdu 4912 Paths on the tree 题目大意:给定一棵树,和若干个通道,要求尽量选出多的通道,并且两两通道不想交. 解题思路:用树链剖分求LCA,然后根据通道两端节点的LCA深度排序,从深度最大优先选,判断两个节点均没被标 记即为可选通道.每次选完通道,将该通道LCA以下点全部标记. #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include

HDU 2586 + HDU 4912 最近公共祖先

先给个LCA模板 HDU 1330(LCA模板) #include <cstdio> #include <cstring> #define N 40005 struct Edge{ int x,y,d,ne; }; Edge e[N*2],e2[N*2]; int be[N],be2[N],all,all2,n,m; bool vis[N]; int fa[N]; int ancestor[N][3]; int dis[N]; void add(int x, int y, int

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

HDU 4912 Paths on the tree LCA 排序贪心

lca... 排个序然后暴力保平安 _(:зゝ∠)_ #pragma comment(linker, "/STACK:102400000,102400000") #include"cstdio" #include"iostream" #include"set" #include"queue" #include"string.h" using namespace std; #define

hdu 4912 Paths on the tree(树链拆分+贪婪)

题目链接:hdu 4912 Paths on the tree 题目大意:给定一棵树,和若干个通道.要求尽量选出多的通道,而且两两通道不想交. 解题思路:用树链剖分求LCA,然后依据通道两端节点的LCA深度排序,从深度最大优先选.推断两个节点均没被标 记即为可选通道. 每次选完通道.将该通道LCA下面点所有标记. #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #includ

HDU 4793 Collision --解方程

题意: 给一个圆盘,圆心为(0,0),半径为Rm, 然后给一个圆形区域,圆心同此圆盘,半径为R(R>Rm),一枚硬币(圆形),圆心为(x,y),半径为r,一定在圆形区域外面,速度向量为(vx,vy),硬币向圆盘撞过去,碰到圆盘后会以相反方向相同速度回来(好像有点违背物理规律啊,但是题目是这样,没办法).问硬币某一部分在圆形区域内的总时间. 解法: 解方程,求 (x+vx*t,y+vy*t) 代入圆形区域方程是否有解,如果没解,说明硬币运动轨迹与圆形区域都不相交,答案为0 如果有解,再看代入圆盘有

HDU 4912 LCA+策略

点击打开链接 题意:给了一个树,然后m条路径,问最多可以选多少条路径而没有一个点是重复使用的,如第二组样例,3条路径是4-2-5和6-3-7和2-1-3,那么只能选前两个使得所选路径最多 思路:没啥思路,看了正解竟然是LCA+贪心,好嘛可以这样考虑,对于所有的可选路径,我们先选择最下面的对上面是没有影响的,那么我们可以对每条路经的最上面的那个点进行排序,就按深度由大到小排序,然后这个最上面的点不就是LCA嘛,然后因为是由下到上的,那么对于每次之后就要将以LCA为根的子树节点全部标记,因为它作为深

hdu 4912 Paths on the tree(lca+馋)

意甲冠军:它使树m路径,当被问及选择尽可能多的路径,而这些路径不相交. 思考:贪心,比較忧伤.首先求一下每对路径的lca.依照lca的层数排序.在深一层的优先级高.那么就能够贪心了,每次选择层数最深的那一个,假设两个端点没有被标记,那么就选择这条路径,把lca的子树都标记掉. 代码: #pragma comment(linker, "/STACK:1024000000,1024000000") #include<iostream> #include<cstdio>