[Luogu P3469] [POI2008]BLO-Blockade (割点)
题面
传送门:https://www.luogu.org/problemnew/show/P3469



Solution
先跟我大声念:
poi!
然后开始干正事。
首先,我们先把题目中的点分为两类:去除这个点能把图分为几个部分的,去除这个点不影响整个图的连通性的。
如下图:
点上的数字表示这个点的搜索序。

我们称这些对连通性有影响的点为割点。
先假设我们能求出这些点以及其出去后把图分为几块之后那几块分别的大小。
是不是发现了什么?
对于非割点,答案显然是2*(n-1) (因为它不能影响别的点对连通性,能影响的只是别人到它以及它到别人)
对于割点,它把那几块弄得无法联通,即那几块中不同块的两个点肯定就无法联通了,答案也就是每组块的点的数量互相乘出来,再加上2*(n-1)。
接下来就是如何求割点了。
这时候我们又得请出伟大的Tarjan了。
先回忆一下求强连通分块的做法,我们这里求割点的做法与其类似。
但有以下几点不同:
1.我们在求low的时候不用讨论所连向的点是否在栈中了,因为无向图中没有横插边的说法(但是要记录当前的父亲,防止我们的low直接计算回去)
2.当一个点的某一个孩子的low>=此点的dfn时,说明这个点就是割点。因为孩子的low大于当前节点的dfn,说明它没有办法直接从当前节点回到搜索树搜过的节点。如果当前节点删除了,此孩子将会分割开来)
至于怎么求每个孩子的size........
(我想这个应该不用说了吧)
就是搜的时候加上去就好,如果不清楚的话看一下代码就懂了。
时间复杂度O(n)
完全OjbK
Code
//Luogu P3469 [POI2008]BLO-Blockade
//June,11th,2018
//玄幻割点
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
long long read()
{
long long x=0,f=1; char c=getchar();
while(!isdigit(c)){if(c=='-') f=-1;c=getchar();}
while(isdigit(c)){x=x*10+c-'0';c=getchar();}
return x*f;
}
const int N=100000+100;
vector <long long> e[N],nd_size[N];
int n,m;
int dfn[N],low[N],IsGD[N],nd_to,size[N];
void Tarjan(int now,int fa)
{
dfn[now]=low[now]=++nd_to;
size[now]++;
int temp=0;
for(int i=0;i<int(e[now].size());i++)
if(dfn[e[now][i]]==0)
{
Tarjan(e[now][i],now);
size[now]+=size[e[now][i]];
low[now]=min(low[now],low[e[now][i]]);
if(low[e[now][i]]>=dfn[now])
{
temp+=size[e[now][i]];
IsGD[now]=true;
nd_size[now].push_back(size[e[now][i]]);
}
}
else if(e[now][i]!=fa)
low[now]=min(low[now],low[e[now][i]]);
if(IsGD[now]==true and n-temp-1!=0)
nd_size[now].push_back(n-temp-1);
}
int main()
{
n=read(),m=read();
for(int i=1;i<=n;i++)
{
e[i].reserve(4);
nd_size[i].reserve(4);
}
for(int i=1;i<=m;i++)
{
int s=read(),t=read();
e[s].push_back(t);
e[t].push_back(s);
} Tarjan(1,0); for(int i=1;i<=n;i++)
{
long long ans=2*(n-1);
if(nd_size[i].size()!=0 and nd_size[i].size()!=1)
{
for(int j=0;j<int(nd_size[i].size());j++)
for(int k=j+1;k<int(nd_size[i].size());k++)
ans+=2*nd_size[i][j]*nd_size[i][k];
}
printf("%lld\n",ans);
}
return 0;
}
正解(C++)
[Luogu P3469] [POI2008]BLO-Blockade (割点)的更多相关文章
- P3469 [POI2008]BLO-Blockade(Tarjan 割点)
P3469 [POI2008]BLO-Blockade 题意翻译 在Byteotia有n个城镇. 一些城镇之间由无向边连接. 在城镇外没有十字路口,尽管可能有桥,隧道或者高架公路(反正不考虑这些).每 ...
- 割点判断+luogu 3469 POI2008 BLO
1.根节点,有2棵及以上子树 2.非根节点,有子节点dfn[u]<=low[v] #include <bits/stdc++.h> #define N 1000050 using n ...
- BZOJ 1123 && Luogu P3469 [POI2008]BLO-Blockade 割点+乘法原理
想了半天式子...最后在邓大师的帮助下想出此题....QWQ我还是太菜了 对于一个非割点,ans+=2*(n-1); 对于一个割点,ans+= #include<cstdio> #incl ...
- [LUOGU] P3469 [POI2008]BLO-Blockade
https://www.luogu.org/problemnew/show/P3469 求无向图分别删去每个点后不连通的点对数. 首先,对于任何一个点,它本身删了,就会和剩下的n-1个点不连通,点对是 ...
- 【luogu P3469 [POI2008]BLO-Blockade】 题解
题目链接:https://www.luogu.org/problemnew/show/P3469 #include <cstdio> #include <cstring> #i ...
- bzoj1123 [POI2008]BLO——求割点子树相乘
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1123 思路倒是有的,不就是个乘法原理吗,可是不会写...代码能力... 写了一堆麻麻烦烦乱七 ...
- BZOJ 1123: [POI2008]BLO 求割点_乘法原理_计数
Description Byteotia城市有n个 towns m条双向roads. 每条 road 连接 两个不同的 towns ,没有重复的road. 所有towns连通. Input 输入n&l ...
- 洛谷 P3469 [POI2008]BLO-Blockade (Tarjan,割点)
P3469 [POI2008]BLO-Blockade https://www.luogu.org/problem/P3469 题目描述 There are exactly nn towns in B ...
- bzoj 1123 [POI2008]BLO Tarjan求割点
[POI2008]BLO Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1540 Solved: 711[Submit][Status][Discu ...
随机推荐
- 从面向过程到面向对象再到MVC
/* * * title: 从面向过程到面向对象再到MVC * author: tanghao * date: 2020.9.30 * version: 1.0 * */ 前言 本文档通过一个显示20 ...
- Python练习题 015:一颗自由落地的球
[Python练习题 015] 一球从100米高度自由落下,每次落地后反跳回原高度的一半,再落下.求它在第10次落地时,共经过多少米?第10次反弹多高? ----------------------- ...
- 使用maven整合mybatis时出现org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)
分析原因是mybatis的映射文件的问题,首先进行分析排查: 1.检查mapper接口和对应的xml文件的包名是否对应 2.检查xml文件的namespace与mapper接口的包名是否对应 3.检查 ...
- 基于springboot工程浅谈整合rabbitmq怎么样防止消息发送mq不丢失和消费mq的消息防止丢失
本文只针对springboot整合rabbitmq的消息防丢失,话不多说,上干货.... 设置发送mq消息不丢失实现思路 执行的方案: 第一步,要对队列,消息以及交换机进行持久化操作(保存到物理磁盘中 ...
- Java知识系统回顾整理01基础02面向对象02属性
一.根据实例给出"属性"的定义 一个英雄有姓名,血量,护甲等等状态 这些状态就叫做一个类的属性 二.属性的类型 属性的类型可以是基本类型,比如int整数,float 浮点数 也可以 ...
- Android设备上的逐像素碰撞检测
介绍 我正在我的Android设备上开发一款游戏,不用说,因为我想要接触到尽可能多的用户,我做到了 省略了硬件加速.因此,我需要编写能够在大多数设备上运行的最快的代码.我从一个简单的表面视图开始 并使 ...
- ansible-playbook简介
1. ansible-playbook简介 • Playbooks 与 adhoc 相比,是一种完全不同的运用 ansible 的方式,是非常之强大的. • 简单来说,playbooks 是一种简单的 ...
- Angluar2 项目搭建
一 使用 Angular CLI 官方脚手架 1.安装 cli npm install -g @angular/cli 2.创建工作空间和初始应用 ng new my-app 二 tsLint 代码格 ...
- id+is+深浅co'p'y
day06 一.id.is 关键字:id #唯一的,如果id相同,说明2个变量指向同一个地址,就是变量一==变量二 注意:id相同值一定相同,值相同但是id不一定相同(不同代码块的值相同,他们就像太阳 ...
- DM9000网卡驱动分析(转)
s3c6410自带的DM9000网卡驱动也是基于platform设备模型. 其定义的设备资源在arch/arm/mach-s3c64xx/mach-smdk6410中.有网卡的resource res ...