题目链接:

H - Rescue the Princess

 ZOJ - 4097

学习链接:

zoj4097 Rescue the Princess无向图缩点有重边+lca - lhc..._博客园

题目大意:

首先是T组测试样例,然后是n个点,m条双向边。然后给你u,v,w。问你v和w是否能够到达u,两个人走过的边不能有重复,否则这条边会被压塌。

具体思路:首先对能形成连通块的进行缩点,构成一个个的连通图。然后这样整个图就变成了一个森林,然后再根据染色后的连通块重新建图。

对于每一次的询问,先看这三个点是不是在同一个连通图里面,如果不是在一个连通图里面肯定是非法情况。

然后再就是讨论在同一个连通图里面的情况,通过讨论v和u的关系来表示出所有的情况。

情况1,lca(u,v)=u.

 这种时候肯定是满足的,lca(u,v)=lca(u,w)=lca(v,w)=u.

 

 情况2,lca(u,v)=v.

 情况3,lca(u,v)!=u&&lca(u,v)!=v.

讨论上述情况就可以了。

AC代码:

 #include<bits/stdc++.h>
using namespace std;
# define ll long long
const int maxn =2e5+;
int n,m,k,num,ordofblock,ordoftree;
vector<int>Edge1[maxn];
vector<int>Edge2[maxn];
int dfn[maxn],low[maxn];
int tree[maxn],block[maxn],vis[maxn];
int depth[maxn],father[maxn][];
stack<int>q;
void init()
{
for(int i=; i<=n; i++)
{
Edge1[i].clear();
Edge2[i].clear();
vis[i]=;
dfn[i]=;
low[i]=;
tree[i]=;
block[i]=;
depth[i]=;
for(int j=;j<=;j++)father[i][j]=;
}
while(!q.empty())
q.pop();
num=;
ordofblock=ordoftree=;
}
void tarjan(int cur,int fa,int ord)
{
tree[cur]=ord;
low[cur]=dfn[cur]=++num;
q.push(cur);
int flag=;
for(int i=; i<Edge1[cur].size(); i++)
{
int to=Edge1[cur][i];
if(to==fa)
{
if(++flag<)
continue;
}
if(!dfn[to])
{
tarjan(to,cur,ord);
low[cur]=min(low[cur],low[to]);
}
else if(!block[to])
{
low[cur]=min(low[cur],dfn[to]);
}
}
if(low[cur]==dfn[cur])
{
ordofblock++;
int tmp;
do
{
tmp=q.top();
q.pop();
block[tmp]=ordofblock;
}
while(tmp!=cur);
}
}
void dfs(int u,int root)
{
vis[u]=;
depth[u]=depth[root]+;
father[u][]=root;
for(int i=; (<<i)<=depth[u]; i++)
{
father[u][i]=father[father[u][i-]][i-];
}
for(int i=; i<Edge2[u].size(); i++)
{
int to=Edge2[u][i];
if(to==root)
continue;
dfs(to,u);
}
}
int lca(int t1,int t2)
{
if(depth[t1]>depth[t2])
swap(t1,t2);
for(int i=; i>=; i--)
{
if(depth[t1]<=depth[t2]-(<<i))
{
t2=father[t2][i];
}
}
if(t1==t2)
return t1;
for(int i=; i>=; i--)
{
if(father[t1][i]!=father[t2][i])
{
t1=father[t1][i];
t2=father[t2][i];
}
}
return father[t1][];
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d %d %d",&n,&m,&k);
init();
int st,ed;
for(int i=; i<=m; i++)
{
scanf("%d %d",&st,&ed);
Edge1[st].push_back(ed);
Edge1[ed].push_back(st);
}
for(int i=; i<=n; i++)
{
if(!dfn[i])
{
ordoftree++;
tarjan(i,,ordoftree);
}
}
for(int i=; i<=n; i++)
{
for(int j=; j<Edge1[i].size(); j++)
{
int to=Edge1[i][j];
if(block[i]!=block[to])
{
Edge2[block[i]].push_back(block[to]);
}
}
}
for(int i=; i<=ordofblock; i++)
{
if(!vis[i])
dfs(i,i);
}
int u,v,w;
for(int i=; i<=k; i++)
{
scanf("%d %d %d",&u,&v,&w);
if(tree[u]!=tree[v]||tree[u]!=tree[w]||tree[v]!=tree[w])
{
printf("No\n");
continue;
}
int flag=;
u=block[u],v=block[v],w=block[w];
int uv=lca(u,v);
int uw=lca(u,w);
int vw=lca(v,w);
if(uv==u){
if(uw==u&&vw==u)flag=;
else if(uw!=u)flag=;
else flag=;
}
else if(uv==v){
if(uw==u)flag=;
else flag=;
}
else {
if(uw!=u)flag=;
}
if(flag)
printf("Yes\n");
else
printf("No\n");
}
}
return ;
}

 

H - Rescue the Princess ZOJ - 4097 (tarjan缩点+倍增lca)的更多相关文章

  1. Day10 - A - Rescue the Princess ZOJ - 4097

    Princess Cjb is caught by Heltion again! Her knights Little Sub and Little Potato are going to Helti ...

  2. hdu 4674 Trip Advisor(缩点+倍增lca)

    花了一天半的时间,才把这道题ac= = 确实是道好题,好久没敲这么长的code了,尤其是最后的判定,各种销魂啊~ 题目中给出的条件最值得关注的就是:每个点最多只能在一个环内->原图是由一个个边连 ...

  3. hihoCoder 1185 连通性·三(Tarjan缩点+暴力DFS)

    #1185 : 连通性·三 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 暑假到了!!小Hi和小Ho为了体验生活,来到了住在大草原的约翰家.今天一大早,约翰因为有事要出 ...

  4. POJ 1236 Network of Schools(Tarjan缩点)

    Network of Schools Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 16806   Accepted: 66 ...

  5. King's Quest —— POJ1904(ZOJ2470)Tarjan缩点

    King's Quest Time Limit: 15000MS Memory Limit: 65536K Case Time Limit: 2000MS Description Once upon ...

  6. 【BZOJ-1924】所驼门王的宝藏 Tarjan缩点(+拓扑排序) + 拓扑图DP

    1924: [Sdoi2010]所驼门王的宝藏 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 787  Solved: 318[Submit][Stat ...

  7. sdut 2603:Rescue The Princess(第四届山东省省赛原题,计算几何,向量旋转 + 向量交点)

    Rescue The Princess Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 Several days ago, a b ...

  8. BZOJ 1051 受欢迎的牛(Tarjan缩点)

    1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 4573  Solved: 2428 [Submit][S ...

  9. sdutoj 2603 Rescue The Princess

    http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2603 Rescue The Princess ...

随机推荐

  1. plink格式文件转化为vcf文件(VCF versions convert)

    plink1.9版本支持转化为VCFv4.2格式 plink2.0版本支持转化为VCFv4.3格式 两个版本用到的命令不一样 对于plink1.9版本,转化为vcf文件的命令行为: plink --b ...

  2. 斯坦福大学公开课机器学习:machine learning system design | error metrics for skewed classes(偏斜类问题的定义以及针对偏斜类问题的评估度量值:查准率(precision)和召回率(recall))

    上篇文章提到了误差分析以及设定误差度量值的重要性.那就是设定某个实数来评估学习算法并衡量它的表现.有了算法的评估和误差度量值,有一件重要的事情要注意,就是使用一个合适的误差度量值,有时会对学习算法造成 ...

  3. Day6--Python--小数据池和再谈编码

    一.小数据池 参考 目的:缓存我们字符串,整数,布尔值.在使用的时候不需要创建过多的对象 缓存: int, str, bool int: 缓存范围 -5~256 str: 1. 长度小于等于1,直接缓 ...

  4. js数组歌

    判断是不是数组,isArray最靠谱. 按照条件来判断,every/some给答案 是否包含此元素,includes最快速. find/findIndex很相似,按条件给第一个值. indexOf/l ...

  5. 应用实战:从Redis到Aerospike,我们踩了这些坑

    个推专注为开发者们提供消息推送服务多年.通过个推SDK,手机终端与服务器建立长连接,维持在线状态.然而在网络异常等情况下,消息无法实时送达到终端用户,因而推送服务器建立了一份离线消息列表,以待用户重新 ...

  6. CentOS6.9快速安装配置svn

    CentOS6.9快速安装配置svn 环境介绍: 操作系统:CentOS release 6.9 (Final)192.168.65.130 (svn服务器)192.168.65.129 (svn客户 ...

  7. mac上安装虚拟机

    1.Mac | 怎么安装虚拟机 2.Mac | 怎么安装VMware Fusion虚拟机 资源下载链接: 1.win7旗舰版-64位.iso 2.VMFusion811.rar

  8. hd loadBalanceServer F5 BIG-IP / Citrix NetScaler / Radware / Array / HAProxy /

    s 五.Citrix NetScaler 和 CDN 案例 问题描述: Citrix 10.5.66.9软件版本下,存在计时器bug,此bug会造成CDN长连接回源超过设备默认的180S,会发fin包 ...

  9. centos 6.5 ruby环境安装

    redis3.0以上支持集群,自带集群管理工具redis-trib.rb:在搭建集群前,安装ruby环境 ruby安装包下载 安装开发工具 1.命令:yum groupinstall "De ...

  10. appcms SSRF 绕过漏洞[转载]

    漏洞 <?php if(isset($_GET['url']) && trim($_GET['url']) != '' && isset($_GET['type' ...