XJOI网上同步测试DAY14 T3
思路:tarjan把桥找出来,然后缩点,注意这里的缩点是:如果两个点之间的连边不是桥,那么就把他们缩起来,然后用一个lct维护,对于每个询问,如果官道连接的是两个联通块的话,就把他们连起来,否则我们就把u到v的路径全部染色成0
最后只要询问缩点完的S到缩点完的T的路径上有多少是1就是答案了,最后复杂度:O(nlogn)
至于为什么这么做:因为我们要找必经过的边,这不就是桥吗,那我们先预处理出原来图的桥,然后把图转变成树,之后对于官道来说,它只要是连接了两个在同一个联通块里的点,就表明这段路绝对不可能是必经之路,而对于连接两个连通分量的边,那么它就是新的桥啊!因此它要被新建成为lct中的一条边。
#include<cstdio>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<cstring>
struct edge{
int u,v;
}e[];
int n,m;
int tot,go[],next[],first[],Id[];
int ch[][],sz,num,sum[],w[],col[],tag[];
int dfn[],low[],pd[],vis[];
int st[],c[],belong[],fa[];
int rev[],size[];
int read(){
int t=,f=;char ch=getchar();
while (ch<''||ch>''){if (ch=='-')f=-;ch=getchar();}
while (''<=ch&&ch<=''){t=t*+ch-'';ch=getchar();}
return t*f;
}
void insert(int x,int y,int id){
tot++;
go[tot]=y;
next[tot]=first[x];
first[x]=tot;
Id[tot]=id;
}
void add(int x,int y,int id){
insert(x,y,id);
insert(y,x,id);
}
void tarjan(int x,int Fa){
dfn[x]=low[x]=++sz;
for (int i=first[x];i;i=next[i])
if (Id[i]!=Fa){
int pur=go[i];
if (!dfn[pur]){
tarjan(pur,Id[i]);
low[x]=std::min(low[x],low[pur]);
if (low[pur]>dfn[x]) pd[Id[i]]=;
}else{
low[x]=std::min(low[x],dfn[pur]);
}
}
}
void bfs(int x){
int h=,t=;c[]=x;vis[x]=;belong[x]=++num;
while (h<=t){
int now=c[h++];
for (int i=first[now];i;i=next[i]){
int pur=go[i];
if (pd[Id[i]]||vis[pur]) continue;
c[++t]=pur;
vis[pur]=;
belong[pur]=num;
}
}
}
bool isroot(int x){
return ch[fa[x]][]!=x&&ch[fa[x]][]!=x;
}
void pushdown(int x){
int l=ch[x][],r=ch[x][];
if (tag[x]!=){
int id=(tag[x]==)?:;
if (l)tag[l]=tag[x];
if (r)tag[r]=tag[x];
if (l&&w[l]) col[l]=id;
if (r&&w[r]) col[r]=id;
if (l) sum[l]=size[l]*id;
if (r) sum[r]=size[r]*id;
tag[x]=;
}
if (rev[x]){
rev[l]^=;
rev[r]^=;
rev[x]=;
std::swap(ch[x][],ch[x][]);
}
}
void updata(int x){
int l=ch[x][],r=ch[x][];
if (w[x]==){
col[x]=;sum[x]=;size[x]=;
if (l) sum[x]+=sum[l],size[x]+=size[l];
if (r) sum[x]+=sum[r],size[x]+=size[r];
return;
}
sum[x]=col[x];size[x]=;
if (l) sum[x]+=sum[l],size[x]+=size[l];
if (r) sum[x]+=sum[r],size[x]+=size[r];
}
void rotate(int x){
int y=fa[x],z=fa[y],l,r;
if (ch[y][]==x) l=;else l=;r=l^;
if (!isroot(y)){
if (ch[z][]==y) ch[z][]=x;else ch[z][]=x;
}
fa[x]=z;fa[y]=x;fa[ch[x][r]]=y;
ch[y][l]=ch[x][r];ch[x][r]=y;
updata(y);updata(x);
}
void splay(int x){
int top=;st[]=x;
for (int i=x;!isroot(i);i=fa[i])
st[++top]=fa[i];
for (int i=top;i;i--)
pushdown(st[i]);
while (!isroot(x)){
int y=fa[x],z=fa[y];
if (!isroot(y)){
if (ch[y][]==x^ch[z][]==y) rotate(x);
else rotate(y);
}
rotate(x);
}
//updata(x);
}
void access(int x){
for (int t=;x;t=x,x=fa[x]){
splay(x);
ch[x][]=t;
updata(x);
}
}
void makeroot(int x){
access(x);splay(x);rev[x]^=;
}
int find(int x){
access(x);splay(x);
while (ch[x][]) x=ch[x][];
return x;
}
void cut(int x,int y){
makeroot(x);access(y);splay(y);
ch[y][]=fa[ch[y][]]=;
updata(y);
}
void link(int x,int y){
makeroot(x);fa[x]=y;
}
int main(){
n=read();m=read();
for (int i=;i<=m;i++){
e[i].u=read();e[i].v=read();
add(e[i].u,e[i].v,i);
}
for (int i=;i<=n;i++)
if (!dfn[i]) tarjan(i,);
sz=;num=;
for (int i=;i<=n;i++)
if (!vis[i]) bfs(i);
sz=num;
for (int i=;i<=m;i++)
if (belong[e[i].u]!=belong[e[i].v]){
sz++;col[sz]=;tag[sz]=;sum[sz]=;w[sz]=;
size[sz]=;
link(sz,belong[e[i].u]);
link(sz,belong[e[i].v]);
}
int q=read();
while (q--){
int S=read(),T=read(),Num=read(),cnt=;
S=belong[S],T=belong[T];
for (int i=;i<=Num;i++){
e[i].u=read();e[i].v=read();
e[i].u=belong[e[i].u];
e[i].v=belong[e[i].v];
}
for (int i=;i<=Num;i++){
if (e[i].u==e[i].v) continue;
if (find(e[i].u)!=find(e[i].v)){
w[sz+i]=;sum[sz+i]=;
tag[sz+i]=;col[sz+i]=;
size[sz+i]=;
link(e[i].u,sz+i);
link(e[i].v,sz+i);
pd[i]=;
}else{
pd[i]=;
makeroot(e[i].u);access(e[i].v);splay(e[i].v);
tag[e[i].v]=;
}
}
if (find(S)!=find(T)){
puts("-1");
}else{
makeroot(S);access(T);splay(T);
printf("%d\n",sum[T]);
}
for (int i=Num;i>=;i--){
if (e[i].u==e[i].v) continue;
if (pd[i]==){
cut(e[i].u,sz+i);
cut(e[i].v,sz+i);
}else{
makeroot(e[i].u);access(e[i].v);splay(e[i].v);
tag[e[i].v]=-;
}
}
}
}
XJOI网上同步测试DAY14 T3的更多相关文章
- XJOI网上同步测试DAY14 T2
思路:先考虑在D高度的最小圆覆盖,再一层一层往下走时,可以保证圆心与最开始的圆相同的时候答案是最优的. 时间复杂度O(n) 有一个坑点,就是我用了srand(time(NULL))就T了,RP太差了. ...
- XJOI网上同步测试DAY14 T1
思路:线段树维护最短路 #include<cstdio> #include<cmath> #include<iostream> #include<algori ...
- XJOI网上同步训练DAY5 T3
就是对于一个数,我们去考虑把t*****减到(t-1)9999*的代价. #include<cstdio> #include<cmath> #include<algori ...
- XJOI网上同步训练DAY1 T3
思路:一开始看到这题的时候想DP,可是发现貌似不行..因为有前缀也有后缀,而且有的后缀会覆盖到现在的前缀,这就不满足无后效性了啊! 但是有个很巧妙的思路:如果我们知道a[i]的最大值,那么p的数量和q ...
- XJOI网上同步训练DAY6 T2
思路:记得FJ省队集训好像有过这题,可是我太弱了,根本不懂T_T #include<cstdio> #include<iostream> #include<cmath&g ...
- XJOI网上同步训练DAY6 T1
思路:考试的时候直接想出来了,又有点担心复杂度,不过还是打了,居然是直接A掉,开心啊. 我们发现,Ai<=7,这一定是很重要的条件,我们考虑状态压缩,去枚举路径中出现了哪些数字,然后我们把原来n ...
- XJOI网上同步训练DAY5 T1
思路:考虑得出,最终的集合一定是gcd=1的集合,那么我们枚举n个数中哪个数必须选,然后把它质因数分解,由于质数不会超过9个,可以状态压缩,去得出状态为0的dp值就是答案. #include<c ...
- XJOI网上同步训练DAY3 T2
考试的时候已经想出来怎么做了,但是没有时间打了T_T 思路:我们考虑将询问以lim排序,然后树链剖分,把边作为线段树的节点,然后随着询问lim的增大,改变线段树中节点的信息,然后每次询问我们用树链剖分 ...
- XJOI网上同步训练DAY3 T1
思路:看来我真是思博了,这么简单的题目居然没想到,而且我对复杂度的判定也有点问题.. 首先我们选了一个位置i的b,那一定只对i和以后的位置造成改变,因此我们可以这样看: 我们从前往后选,发现一个位置的 ...
随机推荐
- c31 rotc_百度百科
c31 rotc_百度百科 c31 rotc
- java常用包
java的核心类都放在java这个包以及其子包下,java扩展的许多类都放在javax包以及其子包下.这些实用类也就是平时经常说的API(应用程序接口). 以下几个是java语言中常用包 java.l ...
- javascript表单行为效果展示
效果如下 以上效果是在点击下一步的时候触发的效果显示 代码如下 ////加工厂$(function() { $("#planttwo").click(function () { v ...
- 跟Google学习Android开发-起始篇-构建你的第一个应用程序(4)
说明:此系列教程翻译自Google Android开发者官网的Training教程,利用Chome浏览器的自动翻译功能作初译,然后在一些语句不顺或容易造成误解的地方作局部修正.方便英文不好的开发者查看 ...
- iOS键盘覆盖输入框的处理.doc
在一个多项输入界面上,会有多个UITextfield类型的输入框.为了滚动方面,我们会将他们一一添加到UITableView的cell中,从而组成一个可以上下滑动的数据输入界面. 但是字符输入是通过系 ...
- Asp.Net异常:"由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值"的解决方法
今天项目中碰到一个以前从没有见过的异常信息“由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值”,于是查了一下资料,原来此异常是由于我在代码中使用了"Response.End ...
- 微信公众账号【iOSDevTip】推出新栏目【看大牛】
首先你须要关注微信公众账号[iOSDevTip] 基于微信公众平台数据分析.非常easy发现.移动端project师都喜欢关注互联网创业资讯.都说.一个不关注互联网创业的iOS开发不是一个合格的互联网 ...
- 36th成都区域赛网络赛 hdoj4039 The Social Network(建图+字符串处理)
这题是某年成都区域赛网络赛的一题. 这题思路非常easy,可是从时间上考虑,不妨不要用矩阵存储,我用的链式前向星. 採用线上查询.利用map对字符串编号,由于非常方便.要推荐的朋友,事实上就是朋友的朋 ...
- (十)unity4.6学习Ugui中文文档-------參考-UGUI Canvas Components
大家好,我是孙广东. 转载请注明出处:http://write.blog.csdn.net/postedit/38922399 更全的内容请看我的游戏蛮牛地址:http://www.unit ...
- Java基础知识强化20:面向对象和面向过程的思想对比
面向对象与面向过程的区别 1. 与面向对象编程思想相比较的,往往是面向过程的编程思想,其实在我来理解,两者并不冲突,原因是面向对象的编程也必须使用面向过程的思维来实现具体的功能,所以我认为,两者的区 ...