哈理工oj 1373-Leyni, LOLI and Leaders

链接:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1373

这道题是给出一些父子关系,并且关系可以传递,要快速确定出来两个点之间的具体的关系是什么,或者是没有关系,这道题要用到深度优先搜索的开始时间和结束时间,具体内容可以参考算法导论,用d[u]表示u节点的开始时间,f[u]表示u节点的结束时间,则如果,d[u]<d[v]<f[v]<f[u]则可以确定v是u的子节点

View Code
 1 #include<stdio.h>
 2 #include<string.h>
 3 #define N 100005
 4 int v[N];
 5 int head[N];
 6 int d[N];
 7 int f[N];
 8 int t;
 9 int time;
10 struct edge
11 {
12     int v;
13     int next;
14 };
15 edge e[N];
16 void init()
17 {
18     t=0;
19     time=0;
20     memset(head,-1,sizeof(head));
21 }
22 void add(int u,int v)
23 {
24     e[t].v=v;
25     e[t].next=head[u];
26     head[u]=t++;
27 }
28 void dfs(int u)//深搜
29 {
30     d[u]=time++;
31     int i;
32     for(i=head[u];i>=0;i=e[i].next)
33     dfs(e[i].v);
34     f[u]=time++;
35     //printf("%d %d %d\n",u,d[u],f[u]);

36 }
37 int main()
38 {
39     int n,q;
40     int i,m;
41     int temp;
42     scanf("%d",&m);
43     int a,b;
44     int root;
45     while(m--)
46     {
47         init();
48         scanf("%d",&n);
49         for(i=1;i<=n;i++)
50         {
51             scanf("%d",&temp);
52             if(!temp)
53             root=i;
54             else
55             add(temp,i);
56         }
57         dfs(root);
58         scanf("%d",&q);
59         for(i=0;i<q;i++)
60         {
61             scanf("%d%d",&a,&b);
62             if(d[a]<d[b]&&f[a]>f[b])
63             printf("%d>%d",a,b);
64             else if(d[a]>d[b]&&f[a]<f[b])
65             printf("%d<%d",a,b);
66             else
67             printf("%d<>%d",a,b);
68             printf("\n");
69         }
70     }
71     return 0;
72 }

 

posted @ 2012-04-22 21:07  zhenhai  阅读(275)  评论(0编辑  收藏  举报