BZOJ1123 [POI2008]BLO(割点判断 + 点双联通缩点size)
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std; typedef long long ll;
const int maxn = 1e5 + ;
const int maxm = 5e5 + ;
int dfn[maxn], low[maxn], head[maxn];
ll ans[maxn], siz[maxn];
int n, m, tot, num, root;
bool cut[maxn];
struct edge{
int to, next;
} ed[*maxm];
inline void init(){
memset( head, -, sizeof(head) );
memset( dfn, , sizeof(dfn) );
memset( cut, false, sizeof(cut) );
memset( ans, , sizeof(ans) );
num = ;
tot = ;
} inline int min( int a, int b ){
return a<b ? a:b;
} inline void add( int u, int v ){
tot ++;
ed[tot].to = v;
ed[tot].next = head[u];
head[u] = tot;
} inline void tarjan( int u ){
dfn[u] = low[u] = ++num;
siz[u] = ;
int flag = , sum = ;
for( int i=head[u]; i!=-; i=ed[i].next ){
int v = ed[i].to;
if( !dfn[v] ){
tarjan(v);
siz[u] += siz[v]; //计算子树的点个数
low[u] = min(low[u], low[v]);
if( dfn[u]<=low[v] ){
flag ++;
ans[u] += (ll)siz[v]*(n-siz[v]); //if(cut[i]) ans = (i的子树, 除该子树的其他部分)的点对和
sum += siz[v];
if( u!=root || flag> ) cut[u] = true;
}
}else low[u] = min(low[u], dfn[v]);
}
if( cut[u] ) ans[u] += (ll)(n-sum-)*(sum+) + (n-); //如果去掉的点i是割点ans继续累加上(其他部分,i和i的子树)点对 + (i, 除i的其他部分)点对
else ans[u] = *(n-); //if(!cut[i]) ans = 2*(n-1)
} int main(){
scanf("%d%d", &n, &m);
init();
for( int i=; i<m; i++ ){
int u, v;
scanf("%d%d", &u, &v);
add( u, v );
add( v, u );
}
root = ;
tarjan();
for( int i=; i<=n; i++ )
printf("%lld\n", ans[i]); return ;
}
/*Sample Input
5 5
1 2
2 3
1 3
3 4
4 5
Sample Output
8
8
16
14
8
*/
BZOJ1123 [POI2008]BLO(割点判断 + 点双联通缩点size)的更多相关文章
- poj 3694双联通缩点+LCA
题意:给你一个无向连通图,每次加一条边后,问图中桥的数目. 思路:先将图进行双联通缩点,则缩点后图的边就是桥,然后dfs记录节点深度,给出(u,v)使其节点深度先降到同一等级,然后同时降等级直到汇合到 ...
- hdu 4612 双联通缩点+树形dp
#pragma comment(linker,"/STACK:102400000,102400000")//总是爆栈加上这个就么么哒了 #include<stdio.h> ...
- BZOJ1123: [POI2008]BLO
1123: [POI2008]BLO Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 614 Solved: 235[Submit][Status] ...
- Codeforces 1000 组合数可行线段倒dp 边双联通缩点求树直径
A /*Huyyt*/ #include<bits/stdc++.h> #define mem(a,b) memset(a,b,sizeof(a)) using namespace std ...
- BZOJ1123:[POI2008]BLO(双连通分量)
Description Byteotia城市有n个 towns m条双向roads. 每条 road 连接 两个不同的 towns ,没有重复的road. 所有towns连通. Input 输入n&l ...
- bzoj1123 [POI2008]BLO——求割点子树相乘
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1123 思路倒是有的,不就是个乘法原理吗,可是不会写...代码能力... 写了一堆麻麻烦烦乱七 ...
- [BZOJ1123]:[POI2008]BLO(塔尖)
题目传送门 题目描述 Byteotia城市有n个towns.m条双向roads.每条road连接两个不同的towns,没有重复的road.所有towns连通. 输入格式 输入n,m及m条边. 输出格式 ...
- 【dfs+连通分量】Bzoj1123 POI2008 BLO
Description Byteotia城市有n个 towns m条双向roads. 每条 road 连接 两个不同的 towns ,没有重复的road. 所有towns连通. Input 输入n&l ...
- 边的双联通+缩点+LCA(HDU3686)
Traffic Real Time Query System Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ...
随机推荐
- element ui 下拉框绑定对象并且change传多个参数
废话不说直接上代码说明真相. <template> <div class="hello"> <span>可以设置的属性 value-key=&q ...
- 湖南省第6届程序大赛第6题 Biggest Number
Problem F Biggest Number You have a maze with obstacles and non-zero digits in it: You can start fro ...
- nginx 反向代理报400错误与Host关系
转载自:https://blog.csdn.net/qq_22208737/article/details/80787396 如果后端真是的服务器设置有类似防盗链或者根据http请求头中的host字段 ...
- 【剑指offer】链表中的倒数第k个结点
输入一个链表,输出该链表中倒数第k个结点. 分析: 定义两个结点p1和p2都指向头节点,p1先走k-1步,然后p1和p2一起走,当p1走到链表尾部时,p2指向的结点就是倒数第k个结点 遍历一遍链表即可 ...
- 字符串A转换到字符串B,只能一次一次转换,每次转换只能把字符串A中的一个字符全部转换成另一个字符,是否能够转换成功
public class DemoTest { public static void main(String[] args) { System.)); } /** * 有一个字符串A 有一个字符串B ...
- 009 SpringCloud 学习笔记5-----Hystrix保护机制
1.概述 Hystrix,英文意思是豪猪,全身是刺,看起来就不好惹,是一种保护机制.Hystrix也是Netflix公司的一款组件.主页:https://github.com/Netflix/Hyst ...
- 008 SpringCloud 学习笔记4-----Ribbon负载均衡
1.Ribbon概述 实际环境中,我们往往会开启很多个itcast-service-provider的集群.此时我们获取的服务列表中就会有多个,到底该访问哪一个呢? Eureka中已经帮我们集成了负载 ...
- MySQL单机优化---分表、分区、分库
一.分表: 水平分表:根据条件把数据分为N个表(例如:商品表中有月份列,则可以按月份进行水平分表). 使用场景:一张表中数据太多,查询效率太慢. 当需要同时查询被水平分表的多张表时: 在两条SQL语句 ...
- Java开发笔记(一百四十二)JavaFX的对话框
JavaFX的对话框主要分为提示对话框和文件对话框两类,其中提示对话框又分作消息对话框.警告对话框.错误对话框.确认对话框四种.这四种对话框都使用Alert控件表达,并通过对话框类型加以区分,例如Al ...
- STC单片机Flash做EEPROM的代码
STC官方给出的建议: /***************************************************************Author:Liming*** * @brie ...