POJ 1330

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\n",ans);
47     }
48     return 0;
49 }

 

posted @ 2016-07-26 15:22  一个_小菜鸟  阅读(153)  评论(0编辑  收藏  举报