ZOJ 4097 Rescue the Princess
在这个物欲横流的社会
oj冷漠无情
只有这xx还有些温度
越界就越界吧 wrong 怎么回事。。。。
给出一个图
然后给出q次询问
问是否存在v和w分别到u的路径且边不重复
在边双连通分量中 任意两点 都至少存在两条边不重复的路径
那么若u v w 在同一连通图中
则存在
若不在
则只有u在 v 和 w 中间时才存在
想一想是不是
#include <iostream>
#include <cstdio>
#include <sstream>
#include <cstring>
#include <map>
#include <cctype>
#include <set>
#include <vector>
#include <stack>
#include <queue>
#include <algorithm>
#include <cmath>
#include <bitset>
#define rap(i, a, n) for(int i=a; i<=n; i++)
#define rep(i, a, n) for(int i=a; i<n; i++)
#define lap(i, a, n) for(int i=n; i>=a; i--)
#define lep(i, a, n) for(int i=n; i>a; i--)
#define rd(a) scanf("%d", &a)
#define rlld(a) scanf("%lld", &a)
#define rc(a) scanf("%c", &a)
#define rs(a) scanf("%s", a)
#define rb(a) scanf("%lf", &a)
#define rf(a) scanf("%f", &a)
#define pd(a) printf("%d\n", a)
#define plld(a) printf("%lld\n", a)
#define pc(a) printf("%c\n", a)
#define ps(a) printf("%s\n", a)
#define MOD 2018
#define LL long long
#define ULL unsigned long long
#define Pair pair<int, int>
#define mem(a, b) memset(a, b, sizeof(a))
#define _ ios_base::sync_with_stdio(0),cin.tie(0)
//freopen("1.txt", "r", stdin);
using namespace std;
const int maxn = , INF = 0x7fffffff, maxm = , maxh = ;
int n, m, q;
int head[maxn], nex[maxm], cnt, head2[maxn], cnt2;
int pre[maxn], low[maxn], sccno[maxn], dfs_clock, scc_cnt;
int pa[maxn], anc[maxn][maxh + ], deep[maxn], instack[maxn];
int f[maxn];
stack<int> s; struct node
{
int u, v;
}Node[maxm]; void add_(int u, int v)
{
Node[cnt].u = u;
Node[cnt].v = v;
nex[cnt] = head[u];
head[u] = cnt++;
} void add(int u, int v)
{
add_(u, v);
add_(v, u);
} struct edge{
int u, v, next;
}Edge[maxm]; void add2(int u, int v)
{
Edge[cnt2].u = u;
Edge[cnt2].v = v;
Edge[cnt2].next = head2[u];
head2[u] = cnt2++;
} void tarjan(int u,int fa){
low[u] = pre[u] = ++dfs_clock;
s.push(u);
instack[u] = ;
for(int i = head[u]; i != -; i = nex[i])
{
int v = Node[i].v;
if(i == (fa ^ )) continue;
if(!pre[v])
{
tarjan(v, i);
low[u] = min(low[u], low[v]);
}
else if(instack[v])
low[u] = min(low[u], pre[v]); }
if(pre[u] == low[u])
{
scc_cnt++;
for(;;)
{
int x = s.top(); s.pop();
sccno[x] = scc_cnt;
instack[x] = ;
if(x == u) break;
}
}
} int dfs(int u, int fa)
{
for(int i = ; i < maxh; i++)
anc[u][i] = anc[anc[u][i - ]][i - ];
for(int i = head2[u]; i != -; i = Edge[i].next)
{
int v = Edge[i].v;
if(v == fa || deep[v]) continue;
anc[v][] = u;
deep[v] = deep[u] + ;
dfs(v, u);
}
} int lca(int u, int v)
{
if(deep[u] < deep[v]) swap(u, v);
for(int i = maxh; i >= ; i--)
if(deep[anc[u][i]] >= deep[v])
u = anc[u][i]; for(int i = maxh; i >= ; i--)
{
if(anc[u][i] != anc[v][i])
{
u = anc[u][i];
v = anc[v][i];
}
}
if(u == v) return u;
return anc[u][];
} int find(int x)
{
return f[x] == x ? x : (f[x] = find(f[x]));
} void init()
{
rep(i, , maxn) f[i] = i;
mem(head, -);
mem(head2, -);
mem(deep, );
dfs_clock = scc_cnt = cnt = cnt2 = ;
mem(sccno, ); mem(pre, );
mem(low, );
mem(anc, );
mem(instack, );
} int main()
{
int T;
rd(T);
while(T--)
{
init();
rd(n), rd(m), rd(q);
rap(i, , m)
{
int u, v;
rd(u), rd(v);
if(u == v) continue;
add(u, v);
}
for(int i = ; i <= n; i++) if(!pre[i]) tarjan(i, -);
rap(u, , n)
{
for(int i = head[u]; i != -; i = nex[i])
{
int v = Node[i].v;
if(sccno[u] != sccno[v])
{
add2(sccno[u], sccno[v]);
int l = find(sccno[u]), r = find(sccno[v]);
if(l == r) continue;
f[l] = r;
}
}
}
rap(i, , scc_cnt)
if(!deep[i]) deep[i] = , dfs(i, -);
rap(i, , q)
{
int u, v, w;
rd(u), rd(v), rd(w);
if(find(sccno[u]) != find(sccno[v]) || find(sccno[u]) != find(sccno[w]))
{
puts("No");
continue;
}
if(sccno[v] != sccno[w])
{
int lc = lca(sccno[v], sccno[w]);
int ans1 = lca(sccno[u], sccno[v]);
int ans2 = lca(sccno[u], sccno[w]);
int ans3 =lca(lc, sccno[u]);
if(ans3 == lc && (ans1 == sccno[u] || ans2 == sccno[u]))
{
puts("Yes");
}
else
{
puts("No");
}
}
else
{
if(sccno[u] == sccno[v] )
{
puts("Yes");
continue;
}
else
puts("No");
}
}
} return ;
}
ZOJ 4097 Rescue the Princess的更多相关文章
- ZOJ 4097 Rescue the Princess 边双缩点+LCA
给你一个图和三个点U,V,W 问你是否存在从U到V和从U到W的两条边不相交路径 先边双缩点 再每个连通分量搞LCA 最后LCA判 #include<bits/stdc++.h> usin ...
- H - Rescue the Princess ZOJ - 4097 (tarjan缩点+倍增lca)
题目链接: H - Rescue the Princess ZOJ - 4097 学习链接: zoj4097 Rescue the Princess无向图缩点有重边+lca - lhc..._博客园 ...
- sdut 2603:Rescue The Princess(第四届山东省省赛原题,计算几何,向量旋转 + 向量交点)
Rescue The Princess Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 Several days ago, a b ...
- 山东省第四届acm.Rescue The Princess(数学推导)
Rescue The Princess Time Limit: 1 Sec Memory Limit: 128 MB Submit: 412 Solved: 168 [Submit][Status ...
- 计算几何 2013年山东省赛 A Rescue The Princess
题目传送门 /* 已知一向量为(x , y) 则将它旋转θ后的坐标为(x*cosθ- y * sinθ , y*cosθ + x * sinθ) 应用到本题,x变为(xb - xa), y变为(yb ...
- sdutoj 2603 Rescue The Princess
http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2603 Rescue The Princess ...
- SDUT 2603:Rescue The Princess
Rescue The Princess Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 Several days ago, a b ...
- 2013山东省“浪潮杯”省赛 A.Rescue The Princess
A.Rescue The PrincessDescription Several days ago, a beast caught a beautiful princess and the princ ...
- 山东省赛A题:Rescue The Princess
http://acm.sdibt.edu.cn/JudgeOnline/problem.php?id=3230 Description Several days ago, a beast caught ...
随机推荐
- JS 事件绑定,监听,委托(代理)
我们经常会遇到JavaScript的事件机制,例如,事件绑定.事件监听.事件委托(事件代理)等.这些名词是什么意思呢,有什么作用呢? 在JavaScript中,有三种常用的绑定事件的方法: 在DOM元 ...
- .Net Core + Angular Cli / Angular4 开发环境搭建
一.基础环境配置 1.安装VS 2017 v15.3或以上版本 2.安装VS Code最新版本 3.安装Node.js v6.9以上版本 4.重置全局npm源,修正为 淘宝的 NPM 镜像: npm ...
- Mac 终端 显示隐藏文件
defaults write com.apple.finder AppleShowAllFiles Yes && killall Finder //显示隐藏文件 defaults wr ...
- Python编写脚本(输出三星形状的‘*’符号)
环境:python3.* 心得:个人认为脚本非我强项,以下效果可以有更简单解决方案,纯属练习逻辑. 方案一: s=1 while s<=10: #这是决定多少列,起始为1,大循环一圈即加一,就是 ...
- Powershell-获取命令和帮助
Get-Help 获取命令的帮助文档 Update -Help 更新帮助文档 Save-Help 保存文档 Get-Help Get-VM 加上-Full参数获取详细说明 [-name] <st ...
- 虚拟机 与 host主机,无法ping通的问题
这个写的比较简单,先做以下记录 centos虚拟机安装到别的电脑上,因为linux中的程序需要向外有网络互通,所以需要重新设置ip 通过 ifconfig eth4 192.168.0.20 bro ...
- 一致性哈希算法----nginx负载均衡器配置之一
一直性Hash算法在很多场景下都有应用,尤其是在分布式缓存系统中,经常用其来进行缓存的访问的负载均衡,比如:redis等<k,v>非关系数据库作为缓存系统.我们首先来看一下采用取模方式进行 ...
- LeetCode算法题-Assign Cookies(Java实现)
这是悦乐书的第234次更新,第247篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第101题(顺位题号是455).假设你是一个很棒的父母,并想给你的孩子一些饼干.但是,你 ...
- sizeof和strlen()区别及用法
//sizeof是以字节为单位计算变量或类型所占内存大小,它是属于C语言运算符系列:而strlen()是一个函数,是计算字符串长度(也是以字节为单位,但略有区别):比如: char array[] = ...
- 好程序员web前端分享css常用属性缩写
好程序员web前端分享css常用属性缩写,使用缩写可以帮助减少你CSS文件的大小,更加容易阅读.css缩写的主要规则如下: 颜色 16进制的色彩值,如果每两位的值相同,可以缩写一半,例如: #0000 ...