链接: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 }