题意:N个人要参加一个局,每个人有自己的好朋友,如果他的好朋友来,他才有可能来。N个人的关系不够成环。Q次查询,问若x来了,y是否肯定来。

分析:若点y是x的祖先,则y肯定回来。一次dfs确定每个点覆盖的区间,若点x的dfs序在y的覆盖区间内,则y肯定会来。

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5+5;
typedef long long LL;
const int INF = 0x3f3f3f3f;
struct Edge{
int v,next;
}edges[maxn];
int tot,head[maxn],dfn;
int L[maxn],R[maxn];
int ind[maxn];
void init()
{
memset(head,-1,sizeof(head));
memset(ind,0,sizeof(ind));
memset(L,0,sizeof(L));
tot= dfn = 0;
} void AddEdge(int u,int v)
{
edges[tot] = (Edge){v,head[u]};
head[u] = tot++;
} void dfs(int u)
{
L[u] = ++dfn;
for(int i=head[u];~i;i=edges[i].next){
int v = edges[i].v;
dfs(v);
}
R[u] = dfn;
} int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
int st,N,M;
int u,v,tmp;
while(scanf("%d %d",&N,&M)==2){
init();
for(int i =1;i<=N;++i){
scanf("%d",&u);
if(u==-1) continue;
u++;
AddEdge(u,i);
ind[i]++;
}
for(int i=1;i<=N;++i){
if(!ind[i]) dfs(i);
}
while(M--){
scanf("%d %d",&u,&v);
u++,v++;
//cout<<L[v]<<" "<<R[v]<<endl;
if(L[u]>=L[v] && L[u]<=R[v]) printf("Yes\n");
else printf("No\n");
}
}
return 0;
}

最新文章

  1. db2数据库安装注意几个问题
  2. mysql 64 zip download
  3. 标准I/O之实现细节
  4. WPF中嵌入Flash(ActiveX)
  5. CentOS 搭建 FastDFS-5.0.5集群
  6. a^b的前n位数
  7. 用MVC4+EF改写XXX系统的计划--前言
  8. 开机自动挂载 VHD 的方法
  9. IOS 看懂此文,你的block再也不需要WeakSelf弱引用了!
  10. 跟我学ASP.NET MVC之四:使用Razor
  11. XSS(四)攻击防御
  12. listview 样式 LVS_REPORT 与 LVS_EDITLABELS 编辑单元格时,当前行第一列内容不显示
  13. 暑假里的第八篇Java
  14. 获取checkbox勾选的id
  15. [P1516]青蛙的约会 (扩展欧几里得/中国剩余定理?)
  16. android studio相关配置
  17. 【Noip模拟 20160929】划区灌溉
  18. BLDC
  19. 酷炫的SVG 动态图标
  20. ant____&lt;project&gt;标签的使用与含义

热门文章

  1. Windows网络接口API函数
  2. JQuery------实现点击左右按钮,切换图片功能
  3. MapRecude
  4. Java--运算符的优先级表
  5. Python--进阶处理2
  6. Django--20170905--笔记
  7. Socket连接何时需要断开
  8. DEV中gridview常用属性
  9. Python量化常用函数
  10. Yii框架2.0的模块