BZOJ1123BLO Tarjan割点+乘法原理+dfs
BZOJ1123 BLO : Tarjan割点+乘法原理+dfs
Description
给定一张无向图,求每个点被封锁之后有多少个有序点对(x,y)(x!=y,1<=x,y<=n)满足x无法到达y
Input
第1行:N, M (1<=N<=100000, 1<=M<=500000)
第2~M+1行 X Y 表示X与Y中有一条边。
Output
共N行,每行一个正整数代表如果去掉第i个点有多少个不能到大的点对。
Sample Input
5 5
1 2
2 3
1 3
3 4
4 5
Sample Output
8
8
16
14
8
HINT
题解
这一题中蕴含的技巧就是求割点时计算其将图分成了多少个大小为多少的连通块。
因为答案就是这些连通块大小互相乘的和。
关键在于,再求割点时维护一个vis[i]代表搜索树中这个子树的大小。
因为一个割点将图分成的连通块是其下面的所有子树(互不相连)与这个点上面的所有点。tmp表示这个点的子树之前的同父亲子树的和。为什么这么算可以得到答案,可以自己推一推。
不要忘记最后答案要乘2。
#include <cstdio>
#include <iostream>
#include <cmath>
#include <stack>
#include <algorithm>
#include <cstring>
#include <climits>
#define MAXN 150000+10
#define MAXM 700000+10
#define LL long long
using namespace std;int head[MAXN],num,n,m;
int dfn[MAXN],low[MAXN],vis[MAXN],dfnum,root,son;
LL ans[MAXN];
struct Edge{int from,to,next;
}edge[MAXM*2];
void add(int from,int to)
{edge[++num].next=head[from];edge[num].from=from;edge[num].to=to;head[from]=num;
}
void tarjan(int x,int fa)
{ LL cnt=0;dfn[x]=low[x]=++dfnum;vis[x]=1;for(int i=head[x];i;i=edge[i].next){ if(edge[i].to==fa) continue;if(!dfn[edge[i].to]){ tarjan(edge[i].to,x);vis[x]+=vis[edge[i].to];//记大小low[x]=min(low[x],low[edge[i].to]);if(low[edge[i].to]>=dfn[x]){ans[x]+=1LL*cnt*vis[edge[i].to];//加上到edge[i].to这颗子树的方案cnt+=1LL*vis[edge[i].to];}}else if(vis[edge[i].to]) low[x]=min(low[x],dfn[edge[i].to]);}ans[x]+=1LL*cnt*(n-cnt-1);//加上x上面的点的方案
}
int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=m;i++){int x,y;scanf("%d%d",&x,&y);add(x,y);add(y,x);}tarjan(1,0);for(int i=1;i<=n;i++)printf("%lld\n",1LL*(ans[i]+n-1)*2);return 0;
}
BZOJ1123BLO Tarjan割点+乘法原理+dfs相关推荐
- BZOJ1123BLO Tarjan割点
1123: [POI2008]BLO Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2302 Solved: 1138 [Submit][Stat ...
- [模板] tarjan/联通分量/dfs树
边的分类 有向图 有向图边分为四类: 树边, 前向边, 返祖边(后向边), 横叉边. 上图: 判定 对图进行dfs, 不考虑已经遍历过的点, 得到dfs序 \(dfn_i\). 在dfs过程中, 记录 ...
- POJ 3713 枚举 + Tarjan 割点
题意 传送门 POJ 3713 题解 白书里归到最大流最小割,Emmmm没有找到复杂度比较低的方法.虽然通道节点不相交可以转化为节点容量为 1,通过拆成 2 个节点并连边转化成最大流问题,但要枚举每一 ...
- 【学习/模板】tarjan割点
P3388 [模板]割点(割顶) tarjan爷爷造福世界 割点适用于无向图, 所以low数组定义发生变化,不再是最早能追溯到的栈中节点编号(因为是无向边,没有意义), 而是一直往下走能绕到的最早的割 ...
- 【UOJ#67】新年的毒瘤 Tarjan 割点
#67. 新年的毒瘤 UOJ直接黏贴会炸... 还是戳这里吧: http://uoj.ac/problem/67#tab-statement Solution 看到这题的标签就进来看了一眼. 想 ...
- jzoj3896-战争游戏【tarjan,割点,点双联通分量】
正题 题目大意 求每个点是多少个点对之间路径的必经点. 解题思路 首先若一个点是在点不是割点,那么答案就是n−1n-1n−1,因为这个点不是除了它自己以为任何点对的必经点. 之后我们记录每个可以割掉的 ...
- BZOJ 1123 Luogu P3469 [POI2008]BLO-Blockade 割点+乘法原理
想了半天式子...最后在邓大师的帮助下想出此题....QWQ我还是太菜了 对于一个非割点,ans+=2*(n-1); 对于一个割点,ans+= #include<cstdio> #incl ...
- tarjan——割点
不赘叙了,问就是找图里的割点. 运用tarjan算法,维护dfn[] 和 low[] 两个数组, 先说结论吧,就是: 一个割点,他的所有子节点的low值都会大于等于该割点的dfn值, 也即,对于边(u ...
- [Tarjan][割点] 洛谷 P3469 BLO-Blockade
题意翻译 在Byteotia有n个城镇. 一些城镇之间由无向边连接. 在城镇外没有十字路口,尽管可能有桥,隧道或者高架公路(反正不考虑这些).每两个城镇之间至多只有一条直接连接的道路.人们可以从任意一 ...
最新文章
- Best practice for JVM Tuning[转]
- python第三方插件登录网易音乐_python3-使用requests模拟登录网易云音乐
- Linux下的用户切换命令
- nginx配置不记录指定文件类型日志
- 标准正态分布怎么算_如何使用标准正态分布表?
- 张晨北京科技大学计算机,混合群智能优化算法研究及应用
- c++ 时间轮与时间堆定时器
- vue + 高德地图 + 图例
- JAVA基础之HttpServletResponse响应
- Python实现量子态采样
- 虚函数多态性实现求几何图形面积
- img文件制作linux启动u盘,如何在Linux系统中制作可启动img/iso镜像文件
- PHP学习笔记-Session
- clickHouse分区和分片详解
- 电池电压(电量)检测器的制作
- php公众号批量推送,微信公众号文章如何批量发送给指定的用户
- FreeRTOS-ARM架构深入理解
- 为什么选择紫外光固化修复管道?
- Home Server
- QGIS之五自定义界面