题目

割点模板题。

可以将图中的所有点分成两部分,一部分是去掉之后不影响图的连通性的点,一部分是去掉之后影响连通性的点,称其为割点。

然后分两种情况讨论,如果该点不是割点,则最终结果直接加上2*(n-1)。如果是的话,就求子树的每块连通块大小。

一个点的子树可以分成两类:存在返祖边或不存在。

对于前者,割掉该点并不影响连通性,所以和祖先算作一个联通块;

对于后者,割掉该点将使得其变为独立的联通块,所以在搜索时顺便计算\(size\)。

于是可以方便地算出后者的\(size\)之和sum,而前者总大小即为\(n-sum-1\)。

在搜索时一边累加\(sum\),一边累加答案,最后加上\(n-1\),得到的是无序点对的个数。

然后乘法原理即可。

#include <iostream>
#include <stdio.h>
#include <vector>
#include <algorithm>
#include <cstring>
#include <cmath>
#define int long long
using namespace std;
struct edg {
int to, len, nex;
}e[1000100];
int lin[300100], dfn[300100], low[300100], siz[301000], cut[300100], tot, cnt, n, m;
vector <int> s[300010];
inline void add(int f, int t)
{
e[++cnt].to = t;
e[cnt].nex = lin[f];
lin[f] = cnt;
} void Tarjan(int fa, int u)
{
dfn[u] = low[u] = ++tot; int temp;
siz[u]++;
temp = 1;
for (int i = lin[u]; i; i = e[i].nex)
{
int to = e[i].to; if (to == fa) continue;
if (!dfn[to])
{
Tarjan(u, to);
siz[u] += siz[to];
low[u] = min(low[u], low[to]);
if (low[to] >= dfn[u])
{
temp += siz[to];
s[u].push_back(siz[to]);
cut[u] = 1;
}
}
else low[u] = min(low[u], low[to]);
}//求割点
s[u].push_back (n - temp);
}
signed main()
{
scanf("%lld%lld", &n, &m);
for (int i = 1; i <= n; i++)
s[i].reserve(5);
for (int i = 1; i <= m; i++)
{
int a, b;
scanf("%lld%lld", &a, &b);
add(a, b); add(b, a);
}
Tarjan(0, 1);//
for (int i = 1; i <= n; i++)
{
int ans = 2 * (n - 1);//
if (s[i].size() >= 2)//如果他是割点且割了之后会分成两块那就
for (int j = 0; j < (int) s[i].size(); j++)
for (int k = j + 1; k < (int) s[i].size(); k++)
ans += 2 * s[i][j] * s[i][k];//无向图,要乘2
printf("%lld\n", ans);
}
}

洛谷P3469[POI2008]BLO-Blockade的更多相关文章

  1. 洛谷 P3469 [POI2008]BLO-Blockade (Tarjan,割点)

    P3469 [POI2008]BLO-Blockade https://www.luogu.org/problem/P3469 题目描述 There are exactly nn towns in B ...

  2. 【洛谷P3469】BLO

    题目大意:给定 N 个点,M 条边的联通无向图,求出对于每个点来说,将与这个点相连的所有边都去掉后,会少多少个联通的点对 (x,y). 题解:连通性问题从 DFS 树的角度进行考虑.对于 DFS 树当 ...

  3. 洛谷 P3469 [POI2008]BLO-Blockade 题解

    一道经典的割点例题,用size数组记录该子树有多少个节点,sum是这棵搜索树上有多少个节点,sum*(n-sum-1)是将点删掉后的数对数量. #include<iostream> #in ...

  4. 「洛谷P3469」[POI2008]BLO-Blockade 解题报告

    P3469[POI2008]LO-Blockade 题意翻译 在Byteotia有n个城镇. 一些城镇之间由无向边连接. 在城镇外没有十字路口,尽管可能有桥,隧道或者高架公路(反正不考虑这些).每两个 ...

  5. BZOJ1123或洛谷3469 [POI2008]BLO-Blockade

    BZOJ原题链接 洛谷原题链接 若第\(i\)个点不是割点,那么只有这个点单独形成一个连通块,其它点依旧连通,则答案为\(2\times (n-1)\). 若第\(i\)个点是割点,那么去掉这个点相关 ...

  6. 洛谷 P3478 [POI2008]STA-Station

    题目描述 The first stage of train system reform (that has been described in the problem Railways of the ...

  7. 【洛谷P3469】[POI2008]BLO-Blockade

    BLO-Blockade 题目链接 若一个点为割点:统计出每个子树的大小,两两相乘再相加, 再加上n-1,为这个点与其他点的拜访数, 因为拜访是互相的,最后再乘二即可 若一个点不是割点:只有(n-1) ...

  8. 【洛谷 P3469】[POI2008]BLO-Blockade(割点)

    题目链接 题意:一个无向联通图,求删去每个点及其所有边后有多少有序点对的连通性发生了变化. Tarjan求割点的例题.. 如果当前点不是割点,那么它对整个图的连通性不产生影响,只有自己与其他\(n-1 ...

  9. 洛谷 P3477 [POI2008]PER-Permutation 解题报告

    P3477 [POI2008]PER-Permutation 题目描述 Multiset is a mathematical object similar to a set, but each mem ...

随机推荐

  1. JCE安装使用报错

    "description":"No key was installed for encryption service","status":& ...

  2. sublime text3插件增强侧边栏的功能文件的复制粘贴

    快捷键ctrl + shift +p 输入  install package 回车,调出插件搜索器, 在搜索栏中输入 SideBarEnhancements 回车安装插件. 在侧边栏中的各种操作功能增 ...

  3. 使用JsonProperty Attribute修改返回json

    使用JsonProperty Attribute修改返回 json 值的name 本例使用JsonPropertyAttribute在序列化为JSON时更改属性的名称. public class Vi ...

  4. Salesforce 简介

    Salesforce是什么 Salesforce是一个功能全面的云平台.它是践行Saas(软件及服务)概念的先驱之一. Salesforce的核心功能是CRM(客户关系管理系统).系统默认提供大多数C ...

  5. 自动化测试 Appium之Python运行环境搭建 Part2

    Appium之Python运行环境搭建 Part2 by:授客 QQ:1033553122 实践环境 参见 Appium之Python运行环境搭建 Part1 环境部署 1.安装Android SDK ...

  6. Android常用的四种布局(或者说是五种)

    一.FrameLayout(帧布局): 显示特点:所有的子控件默认显示在FrameLayout的左上角,会重叠在一起显示. 常用属性: layout_gravity(设置给子控件,调整控件在容器内的重 ...

  7. StackExchange.Redis中文使用文档

    StackExchange.Redis中文使用文档 Intro 最近想深入学习一些 Redis 相关的东西.于是看了看官方的项目 StackExchange,发现里面有一份文档,于是打算翻译成中文,方 ...

  8. Socket 通讯原理

    Socket是什么呢? Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后 ...

  9. sql面试 查找每个班级的前5名学生(取分类数据的前几条数据)

    关键字PARTITION BY 自己看代码喽~ SELECT * FROM ( SELECT ROW_NUMBER() OVER (PARTITION BY ClassType ORDER BY Sc ...

  10. .net core 命令行(仅作记录)

    命令大全:dotnet 命令 创建NuGet包:如何使用 .NET Core 命令行接口 (CLI) 工具创建 NuGet 包