题目大意

给你一个 n n n 个点和 m m m 条边的无向图,并有 Q Q Q 个询问,每次询问有两种形式:
1.1 X Y P Q , 表示在删掉 P P P 和 Q Q Q 之间的连边后 X X X 和 Y Y Y 是否相互可达(保证 P P P 和 Q Q Q 有边相连)
2.2 X Y P,表示在删掉点 P P P 后 X X X 和 Y Y Y 是否相互可达。
若可达,输出 y e s yes yes ,否则输出 n o no no。

数据范围

n ≤ 1 0 5 , m ≤ 5 ∗ 1 0 5 , Q ≤ 5 ∗ 1 0 5 n \le 10^5 ,m \le 5*10^5 ,Q \le 5*10^5 n≤105,m≤5∗105,Q≤5∗105 。

思路

看到删掉点或边是否可达,我们可以想到割点和桥,倘若删掉的点或边不为割点或桥,那就证明互相可达(前提是 X X X 和 Y Y Y 互相可达)。
对于求割点和桥,我们可以用 T a r j a n Tarjan Tarjan 预处理出来每一个点的 d f s dfs dfs 序 d f n i dfn_{i} dfni​ 以及每个点可以到达的最小的节点(双亲除外)的最小深度优先数(即 d f n dfn dfn) l o w i low_{i} lowi​ ,然后我们就可以用所处理出来的 d f n dfn dfn 和 l o w low low 搞事情 解题啦!

删边操作:
1.若 X X X 和 Y Y Y 不在一个连通图里: 输出 n o no no 。
2.若边 ( P , Q ) (P,Q) (P,Q) 不为桥:输出 y e s yes yes 。
3.若点 X X X 和 Y Y Y 均在 P ( Q ) P(Q) P(Q) 的子树内,如图:

肯定有一条路径不经过边 ( P , Q ) (P,Q) (P,Q) 的,输出 y e s yes yes 。
4.若点 X X X 和点 Y Y Y 均不在点 P ( Q ) P(Q) P(Q) 内(和上图一样),输出 y e s yes yes 。
5.剩余情况:输出 n o no no。

删点操作
同样要先判断 X X X 和 Y Y Y 是否在同一连通图内部。
若点 P P P 不为割点,输出 y e s yes yes 即可。
然后判断 X X X 和 Y Y Y 在 P P P 的哪颗子树,如图:

设点 y a ya ya 为点 X X X 在点 P P P 的儿子 y a ya ya 的子树内,点 y b yb yb 为点 Y Y Y 在点 P P P 的儿子 y b yb yb 的子树内。
1.若点 X X X 和点 Y Y Y均不在 P P P 的子树内(如 x 1 , y 1 x1,y1 x1,y1),输出 y e s yes yes 。
2.若点 X X X 和点 Y Y Y 均在 P P P 的子树内(如 x 2 , y 2 x2,y2 x2,y2):
如果 l o w y a > d f n p low_{ya} > dfn_{p} lowya​>dfnp​ 且 l o w y b > d f n p low_{yb}>dfn_{p} lowyb​>dfnp​ (即点 X X X 和点 Y Y Y均有一条路径可以连向 P P P的祖先),输出 y e s yes yes ,否则输出 n o no no 。
3.若点 X X X 和点 Y Y Y 其一在 P P P 的子树内(如 x 3 , y 3 x3,y3 x3,y3),设点 Y Y Y 在点 P P P 的子树内:
如果 l o w y b > d f n p low_{yb}>dfn_{p} lowyb​>dfnp​ (即 Y Y Y 有一条路径可以到达 P P P 的祖先),输出 y e s yes yes ,否则输出 n o no no 。

求是否在子树内可以处理出每个点的子树大小 s i z e size size 。
求为那个儿子内可以用倍增在线求,也可以用栈离线求。
分类讨论较多,但实质不难,细心点就可以通过了。

AC代码

#include<cstring>
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
struct node{int head,to,nxt;
}edge[1000200];
struct pu{int dfn,dep,low,wz,sz,col;
}tree[1000200];
int n,m,a,b,opt,Q,cnt,sta[1000200],top,tot,f[200200][22],sc;
bool vis[1000200],in_stack[1000200];
bool ge[1000200],isbridge[1000200];
void xx(int u,int v)
{edge[cnt].to=v;edge[cnt].nxt=edge[u].head;edge[u].head=cnt;cnt++;
}
void tarjan(int x,int father,int col)
{vis[x]=1;tot++,top++;sta[top]=tot;in_stack[x]=1;tree[x].low=tree[x].dfn=tot;tree[x].col=col,tree[x].dep=tree[father].dep+1;tree[x].sz=1;
//  printf("!!!%d %d\n",x,tree[x].low);for(int i=1;(1<<i)<=tree[x].dep;i++)f[x][i]=f[f[x][i-1]][i-1];for(int i=edge[x].head;i!=-1;i=edge[i].nxt){int y=edge[i].to;if(y==father)continue;
//      printf("!!!%d %d\n",x,y);if(!vis[y]){f[y][0]=x;tarjan(y,x,col);tree[x].sz+=tree[y].sz;tree[x].low=min(tree[x].low,tree[y].low);}else if(in_stack[y])tree[x].low=min(tree[x].low,tree[y].dfn);}
}
int lca(int u,int v)
{if(tree[u].dep<tree[v].dep)swap(u,v);for(int i=20;i>=0;i--){if(tree[f[u][i]].dep>=tree[v].dep)u=f[u][i];if(u==v)return u;}for(int i=20;i>=0;i--){if(f[u][i]!=f[v][i])u=f[u][i],v=f[v][i];}return f[u][0];
}
int find_son(int x,int y)
{for(int i=20;i>=0;i--)if(tree[f[x][i]].dep>tree[y].dep)x=f[x][i];return x;
}
bool in(int x,int y)
{if(tree[y].dfn<=tree[x].dfn&&tree[y].dfn+tree[y].sz-1>=tree[x].dfn)return 1;return 0;
}
int main()
{//  freopen("check.in","r",stdin);
//  freopen("a.out","w",stdout);memset(edge,-1,sizeof(edge));scanf("%d %d",&n,&m);for(int i=1;i<=m;i++)scanf("%d %d",&a,&b),xx(a,b),xx(b,a);for(int i=1;i<=n;i++)if(!vis[i])tarjan(i,0,i);
//  printf("!\n");
//    int qwq=0;scanf("%d",&Q);while(Q--){scanf("%d",&opt);
//      qwq++;
//      printf("%d ",qwq);if(opt==1){int x,y,p,q;scanf("%d %d %d %d",&x,&y,&p,&q);int LCA=lca(x,y);if(tree[x].dfn<tree[y].dfn)swap(x,y);if(tree[p].dfn<tree[q].dfn)swap(p,q);if(tree[x].col!=tree[y].col){printf("no\n");continue;}if(tree[p].low<=tree[q].dfn){printf("yes\n");continue; }if((in(x,p)&&in(y,p))||(!in(x,p)&&!in(y,p))){printf("yes\n");continue;}printf("no\n");continue;}else{int x,y,p;scanf("%d %d %d",&x,&y,&p);int LCA=lca(x,y);if(tree[x].col!=tree[y].col){printf("no\n");continue;}if(x==p||y==p){printf("no\n");continue;}if(!in(x,p)&&!in(y,p)){printf("yes\n"); continue;} if(in(y,p))swap(x,y);if(!in(y,p)){int ya=find_son(x,p);if(tree[ya].low<tree[p].dfn)printf("yes\n");elseprintf("no\n");continue;}else{int ya=find_son(x,p),yb=find_son(y,p);if(tree[ya].low<tree[p].dfn&&tree[yb].low<tree[p].dfn||ya==yb)printf("yes\n");elseprintf("no\n");continue;}} }
}

【GDKOI2011】反恐任务相关推荐

  1. 成都铁路警方联合多部门开展反恐防暴演练

    特警队员使用盾牌对冲入车站广场的"暴恐分子"进行压制. 王晓丹 摄 特警队员使用盾牌对冲入车站广场的"暴恐分子"进行压制. 王晓丹 摄 特警队员使用盾牌和防暴棍 ...

  2. 效率源应邀出席“第九届刑侦、禁毒、反恐新技术新产品应用交流暨高峰论坛”

    效率源会议现场发回来的报道 时间:2018年9月11日-15日 坐标:广西桂林 会议主题:全面落实"一长四必"现场勘查制度,其实提升全国公安机关现场勘查能力水平,将最新金.最好和最 ...

  3. 《鹰眼》(Eagle Eye):对电子媒介的反恐

    一个刚参加完哥哥葬礼的潦倒男人和一个刚送走孩子去上学的单身女子,分别接到了一个陌生手机,正由于男的经济上贫乏和女的在儿子上母爱的把柄落入了这通手机的控制之中,因此受控于此,参加一场场惊险的夺命之旅.而 ...

  4. 专家的恐惧与专家的“反恐”--关于MDA的一篇评论

    (专家孟岩于2003-12-22 0:56:31)   人民邮电出版社最近出版了一本书,叫做<应用MDA>.据我所知,它是国内第一本介绍MDA概念的图书.目前,MDA还处在"油漆 ...

  5. cf反恐穿越前线java,穿越前线反恐使命

    穿越前线反恐使命是一款写实风格的冒险射击游戏,这款游戏内玩家需要操作特种兵进入废墟城市内的反恐行动,游戏内玩家得控制不同的武器进行作战,玩家之间都需要进行特殊的交流或是语音对话获得对方时刻的作战情况, ...

  6. HDU 1243 反恐训练营(最长公共序列)

    反恐训练营 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submiss ...

  7. 云计算、大数据能为反恐做什么?

    文章讲的是云计算.大数据能为反恐做什么,11月25日召开的国家反恐怖工作领导小组专题会议上,公安部部长郭声琨提出,要运用大数据.云计算技术打击恐怖行为."从海量的人流.物流.信息流.资金流中 ...

  8. 反恐24小时第一季/全集24 Live Another Day迅雷下载

    反恐24小时 第一至九季 24 Season 1-9 (2001-2014) 本季看点:<24小时>第8季将在拥有美国的象征自由女神像的纽约开始,在新的一天,CTU重新开张,新的领导为从M ...

  9. 美剧《反恐24小时》

    最初看美剧是跟着看<越狱>的风,最终被美剧的剧情,场面所折服,看过美剧之后,再看国内的电视剧真的就吸引不了你了. 最后<越狱>还是草草收场,据说还有要出第4季,接着又找来一些美 ...

  10. 反恐24小时[第1季]——我打赌这是我第一次写观后感

    24小时,一个不起眼的名字. 大概两个月前就看了,那时我还在外地出差,由于工作比较忙,每次都是看它一集,甚至有几次看着就睡去了,这么说来就是中间有几集没看完.但整部片子在上周五的晚上终于让我恶狠狠的看 ...

最新文章

  1. linux opencv
  2. 关于c/c++/obj-c的混合使用 (2010-06-22 10:05:33)
  3. Free Code Camp现在有本地组
  4. 自然语言处理实践Task5
  5. JDK,JRE和JVM之间的区别
  6. MySQL实验7存储过程_mysql的总结7--存储过程-阿里云开发者社区
  7. node制作http服务器,NodeJS 搭建 HTTP 服务器
  8. 【汇编语言与计算机系统结构笔记13】简单的上机过程示例
  9. [转]在这新站如何在一天内被Google和百度收录
  10. popular net
  11. Nginx基本配置备忘
  12. 泛微OA如何重置管理员密码
  13. 开始学习鸟哥的Linux私房菜-基础篇(第五章)
  14. Visio自定义连接线,连接点位置
  15. 网咖服务器cpu占用率高,CPU温度过高为什么会卡?
  16. Most of the disks failed
  17. oracle教程课件,Oracle入门教程(PPT课件)
  18. psi-pred安装及预测蛋白质二级结构
  19. win10卸载软件通过控制面板
  20. Nginx 根据链接参数动态代理配置

热门文章

  1. 数据预处理05_ 数据归约
  2. 编程常用Mac快捷键
  3. Python中自定义函数参数类型
  4. 用Python爬取我的微信好友昵称和头像,原来...
  5. 修改设备名称,蓝牙名称,wifi直连名称
  6. python之pandas df.dropna()
  7. 直流电源防反接电路设计
  8. Harmony Native开发-我的OpenSL ES录音机
  9. OverTheWire:Wargame-Natas通关指引
  10. 【Power BI】部分复杂图表名称整理(持续更新)