http://poj.org/problem?id=1330
题意:给你一棵树的上的两个点,要你求这两个点的最近的父亲节点。
第一行的是m案例数
第二行给你个N,代表有N-1种父子关系,其中a b,a是b的父亲。
第N行就是要你求这两个点的最近的父亲节点。
思路:很简单,不用discuss里面的那些,就直接一个递归寻找出第一个点的所以父亲节点,并做好标记,然后用递归寻找第二个点的父亲节点,如果碰到了标记的话,那么这个点就是他们的最近的那个父亲节点。
1 #include <stdio.h> 2 #include <string.h> 3 #define l 100100 4 5 bool mark[l]; 6 int belg[l],ans,flog; 7 8 int bfs(int x) 9 { 10 if(mark[x]) { 11 mark[x]=false; 12 if(!belg[x]) return 0; 13 bfs(belg[x]); 14 } 15 return 0; 16 } 17 int bfs1(int x) 18 { 19 if(belg[x]&&mark[x]) bfs1(belg[x]); 20 if(!mark[x]&&!flog){ 21 ans=x; 22 flog=1; 23 return 0; 24 } 25 return 0; 26 } 27 28 int main() 29 { 30 int m,n,a,b; 31 scanf("%d",&m); 32 while(m--) 33 { 34 scanf("%d",&n); 35 memset(belg,0,sizeof(belg)); 36 memset(mark,true,sizeof(mark)); 37 for(int i=0;i<n-1;i++) 38 { 39 scanf("%d%d",&a,&b); 40 belg[b]=a; 41 } 42 scanf("%d%d",&a,&b); 43 flog=0; 44 bfs(a); 45 bfs1(b); 46 printf("%d ",ans); 47 } 48 return 0; 49 }