这一题,我当年只会$60$分做法。。。。。

我们考虑对原图跑一波边双,然后缩成一个森林。

对于森林中的每一棵树,我们钦定一个根。

令$siz[x]$表示以$x$为根的子树中,在原图中点的个数。

令当前的答案为$ans$

对于一条边$(u,v)$,如果这两个点在缩点后的同个点内,那么什么都不用管,直接输出$ans$即可。

否则我们先令$u=d[u]$,$v=d[v]$,其中$d[i]$表示原图中第$i$号点在缩点后的森林中的编号。

显然这两个点在同一棵树内,不妨设$dep[u]>dep[v]$,令$rt$表示$u$所在的树的根。

显然断掉这条边,增加的非联通点对个数为$siz[u]\times (siz[rt]-siz[u])$。

加上$ans$输出即可。

注意对1000取模!!!

 #include<bits/stdc++.h>
#define L long long
#define M 100005
using namespace std; struct edge{int u,next;}e[M*]={}; int head[M]={},head1[M]={},use=;
void add(int x,int y){e[use].u=y;e[use].next=head[x];head[x]=use++;}
void add1(int x,int y){use++;e[use].u=y;e[use].next=head1[x];head1[x]=use;}
int dfn[M]={},low[M]={},b[M]={},d[M]={},siz[M]={},cnt=,t=; stack<int> s;
int n,m,q;
void dfs(int x,int fa){
dfn[x]=low[x]=++t; s.push(x); b[x]=;
for(int i=head[x];~i;i=e[i].next)
if(i!=fa){
if(!dfn[e[i].u]) dfs(e[i].u,i^),low[x]=min(low[x],low[e[i].u]);
else if(b[e[i].u]) low[x]=min(low[x],dfn[e[i].u]);
}
if(dfn[x]==low[x]){
cnt++; int u;
do{
u=s.top();s.pop();
b[x]=; d[u]=cnt; siz[cnt]++;
}while(u!=x);
}
}
int du[M]={},dep[M]={},ff[M]={};
void dfs1(int x,int fa){
dep[x]=dep[fa]+; ff[x]=ff[fa];
for(int i=head1[x];i;i=e[i].next)
if(e[i].u!=fa)
dfs1(e[i].u,x),siz[x]+=siz[e[i].u];
} int U[M*]={},V[M*]={};
int main(){
memset(head,-,sizeof(head));
scanf("%d%d%d",&n,&m,&q);
for(int i=;i<=m;i++){
int x,y; scanf("%d%d",&x,&y);
x++; y++;
add(x,y); add(y,x);
U[i]=x; V[i]=y;
}
for(int i=;i<=n;i++) if(!dfn[i])
dfs(i,-);
for(int x=;x<=n;x++)
for(int i=head[x];~i;i=e[i].next)
if(d[x]!=d[e[i].u]){
add1(d[x],d[e[i].u]); du[d[x]]++;
}
L ans=1LL*n*n;
for(int i=;i<=cnt;i++)
if(du[i]==||(du[i]==&&dep[i]==)){
ff[]=i; dfs1(i,);
ans-=1LL*siz[i]*siz[i];
}
ans/=;
while(q--){
int id,x,y; scanf("%d",&id); id++;
x=U[id]; y=V[id];
x=d[x]; y=d[y];
if(x==y||ff[x]!=ff[y]){printf("%lld\n",ans%); continue;}
if(dep[x]<dep[y]) swap(x,y);
L minus=1LL*siz[x]*(siz[ff[y]]-siz[x]);
printf("%lld\n",(ans+minus)%);
}
}

【GDOI2015】 水题 tarjan缩点的更多相关文章

  1. bzoj 1179 [APIO 2009]Atm(APIO水题) - Tarjan - spfa

    Input 第一行包含两个整数N.M.N表示路口的个数,M表示道路条数.接下来M行,每行两个整数,这两个整数都在1到N之间,第i+1行的两个整数表示第i条道路的起点和终点的路口编号.接下来N行,每行一 ...

  2. 通讯(tarjan缩点)(20190716NOIP模拟测试4)

    B. 通讯   题目类型:传统 评测方式:文本比较  内存限制:256 MiB 时间限制:1000 ms 标准输入输出 题目描述 “这一切都是命运石之门的选择.” 试图研制时间机器的机关SERN截获了 ...

  3. 20190716NOIP模拟赛T2 通讯(tarjan缩点+贪心)

    题目描述 “这一切都是命运石之门的选择.” 试图研制时间机器的机关SERN截获了中二科学家伦太郎发往过去的一条短 信,并由此得知了伦太郎制作出了电话微波炉(仮). 为了掌握时间机器的技术,SERN总部 ...

  4. P1262 间谍网络 (tarjan缩点 水过去)

    题目描述 由于外国间谍的大量渗入,国家安全正处于高度的危机之中.如果A间谍手中掌握着关于B间谍的犯罪证据,则称A可以揭发B.有些间谍收受贿赂,只要给他们一定数量的美元,他们就愿意交出手中掌握的全部情报 ...

  5. Tarjan水题系列(3):HNOI2006 潘多拉的魔盒

    题目: 链接 大意: 盒子与盒子之间的关系构成一个有向图 求图上包含节点数最多的路径的节点数 思路: 有向图上求包含节点数最多的路径的节点数 可直接使用tarjan缩点后拓扑dp求得 在此不赘述 此题 ...

  6. 【Tarjan缩点】PO3352 Road Construction

    Road Construction Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 12532   Accepted: 630 ...

  7. Wannafly14挑战赛 C(tarjan缩点)题解

    题目:牛客题目链接 思路:这道题有点像这道题 先缩点,缩完之后判断一下整个强连通分量入度是不是0,如果是的话向ans压入该强连通分量最小的那个值.最后排序一下ans输出就行了. 思路一下就想到了,就是 ...

  8. POJ 1236 Network of Schools Tarjan缩点

    Network of Schools Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 22729   Accepted: 89 ...

  9. 【模拟7.16】通讯(tarjan缩点加拓扑排序)

    这题确实水,纯板子,考试意外出错,只拿了暴力分QAQ tarjan缩点加上拓扑排序,注意这里求最短路径时不能用最小生成树 因为是单向边,不然就可能不是一个联通图了.... 1 #include< ...

随机推荐

  1. 2018.09.29 bzoj3675: [Apio2014]序列分割(斜率优化dp)

    传送门 斜率优化dp经典题目. 首先需要证明只要选择的K个断点是相同的,那么得到的答案也是相同的. 根据分治的思想,我们只需要证明有两个断点时成立,就能推出K个断点时成立. 我们设两个断点分成的三段连 ...

  2. Nginx安装SSL安全证书

    1. 在Nginx的安装目录下的config目录下创建cert目录,并且将下载的证书全部文件拷贝到cert目录中.如果申请证书时是自己创建的CSR文件,请将对应的私钥文件放到cert目录下并且命名为2 ...

  3. 28. Bad Influence of Western Diet 西式饮食的消极影响

    28. Bad Influence of Western Diet 西式饮食的消极影响 ① The spread of Western eating habits around the world i ...

  4. C和指针小结(C/C++程序设计)

    C和指针 相关基础知识:内存的分配(谭浩强版) 1.整型变量的地址与浮点型/字符型变量的地址区别?(整型变量/浮点型变量的区别是什么) 2.int *p,指向整型数据的指针变量. 3.通过指针变量访问 ...

  5. tornado+bootstrap急速搭建你自己的网站

    bootstrap既然是这么的流行又能省很多的事为什么不用他呢?再加上牛X的produced by FB的tornado简直如虎添翼了! 1. 安装配置 安装所需要的库等内容.这里没什么需要多讲的.t ...

  6. 【lazy标记得思想】HDU3635 详细学习并查集

    部分内容摘自以下大佬的博客,感谢他们! http://blog.csdn.net/dm_vincent/article/details/7769159 http://blog.csdn.net/dm_ ...

  7. opencv学习_4(opencv基础数据结构 CvPoint & CvSize & CvRect & CvScalar & CvArr & CvMat)

    1:包含在cxcore/include/cxtypes.h头文件中. 2:CvPoint系列   -----(x,y) CvPoint:表示图像中的点 CvPoint2D32f:二维空间中的点 CvP ...

  8. EBS Webservice Timeout,HTTP Server Return "500 Internal Server Error"

    http://blog.itpub.net/26687597/viewspace-1207571/ 基于Oracle EBS R12,开发了一个Webservice用于返回某项主数据,当请求的数据量非 ...

  9. 自适应XAML布局经验总结 (二) 局部布局设计模式1

    本系列对实际项目中的XAML布局场景进行总结,给出了较优化的自适应布局解决方案,希望对大家有所帮助. 下面开始介绍局部布局设计模式. 1. 工具栏模式 适用于工具栏,标题等的布局. 此块布局区域外层使 ...

  10. getpass

    getpass模块用于输入信息时不显示,比如输入密码时隐藏.getpass模块接收用户的输入的数据类型是str类型. #!/usr/bin/env python #-*- coding: utf-8 ...