您的位置:首页 > 其它

哈理工oj 1373-Leyni, LOLI and Leaders

2012-04-22 21:07 381 查看
链接: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

#include<stdio.h>
#include<string.h>
#define N 100005
int v
;
int head
;
int d
;
int f
;
int t;
int time;
struct edge
{
int v;
int next;
};
edge e
;
void init()
{
t=0;
time=0;
memset(head,-1,sizeof(head));
}
void add(int u,int v)
{
e[t].v=v;
e[t].next=head[u];
head[u]=t++;
}
void dfs(int u)//深搜
{
d[u]=time++;
int i;
for(i=head[u];i>=0;i=e[i].next)
dfs(e[i].v);
f[u]=time++;
//printf("%d %d %d\n",u,d[u],f[u]);

}
int main()
{
int n,q;
int i,m;
int temp;
scanf("%d",&m);
int a,b;
int root;
while(m--)
{
init();
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&temp);
if(!temp)
root=i;
else
add(temp,i);
}
dfs(root);
scanf("%d",&q);
for(i=0;i<q;i++)
{
scanf("%d%d",&a,&b);
if(d[a]<d[b]&&f[a]>f[b])
printf("%d>%d",a,b);
else if(d[a]>d[b]&&f[a]<f[b])
printf("%d<%d",a,b);
else
printf("%d<>%d",a,b);
printf("\n");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: