Poj--1330(LCA,tarjan)
2014-10-26 15:28:49
思路:在线 / 离线LCA。练模板的。
1 /************************************************************************* 2 > File Name: 1330.cpp 3 > Author: Nature 4 > Mail: 564374850@qq.com 5 > Created Time: Sat 25 Oct 2014 04:22:56 PM CST 6 ************************************************************************/ 7 8 #include <cstdio> 9 #include <cstring> 10 #include <cstdlib> 11 #include <cmath> 12 #include <vector> 13 #include <map> 14 #include <set> 15 #include <stack> 16 #include <queue> 17 #include <iostream> 18 #include <algorithm> 19 using namespace std; 20 #define lp (p << 1) 21 #define rp (p << 1|1) 22 #define getmid(l,r) (l + (r - l) / 2) 23 #define MP(a,b) make_pair(a,b) 24 typedef long long ll; 25 const int INF = 1 << 30; 26 const int maxn = 10010; 27 28 int T,n,ans,qa,qb; 29 int first[maxn],next[maxn],ver[maxn],ecnt; 30 int f[maxn],vis[maxn],fa[maxn]; 31 32 void Init(){ 33 memset(first,-1,sizeof(first)); 34 memset(vis,0,sizeof(vis)); 35 memset(f,0,sizeof(f)); 36 ecnt = 0; 37 } 38 39 void Add_edge(int u,int v){ 40 next[++ecnt] = first[u]; 41 ver[ecnt] = v; 42 first[u] = ecnt; 43 } 44 45 int Find(int x){ 46 return fa[x] == x ? x : fa[x] = Find(fa[x]); 47 } 48 49 void Union(int u,int v){ 50 int x = Find(u); 51 int y = Find(v); 52 if(x != y) 53 fa[y] = x; 54 } 55 56 bool Tarjan(int p){ 57 fa[p] = p; 58 for(int i = first[p]; i != -1; i = next[i]){ 59 int v = ver[i]; 60 if(Tarjan(v)) 61 return true; 62 Union(p,v); 63 } 64 vis[p] = 1; 65 if(p == qa && vis[qb]){ 66 ans = Find(qb); 67 return true; 68 } 69 if(p == qb && vis[qa]){ 70 ans = Find(qa); 71 return true; 72 } 73 return false; 74 } 75 76 int main(){ 77 int a,b; 78 scanf("%d",&T); 79 while(T--){ 80 scanf("%d",&n); 81 Init(); 82 for(int i = 1; i < n; ++i){ 83 scanf("%d%d",&a,&b); 84 Add_edge(a,b); 85 f[b] = 1; 86 } 87 scanf("%d%d",&qa,&qb); 88 for(int i = 1; i <= n; ++i){ 89 if(!f[i]){ 90 Tarjan(i); 91 break; 92 } 93 } 94 printf("%d\n",ans); 95 } 96 return 0; 97 }

浙公网安备 33010602011771号