题目描述

Byteotia城市有n个 towns m条双向roads. 每条 road 连接 两个不同的 towns ,没有重复的road. 所有towns连通。

输入

输入n<=100000 m<=500000及m条边

输出

输出n个数,代表如果把第i个点去掉,将有多少对点不能互通。

样例输入

5 5
1 2
2 3
1 3
3 4
4 5

样例输出

8
8
16
14
8


题解

DFS树

Tarjan求点双太暴力了。。。还是选择一个优雅一点的做法——DFS树

考虑在DFS的过程中计算删除每个点的答案。

由于DFS树没有横叉边,只有返祖边,因此一个点把整棵树分为一些部分(下面简称“块”):父树部分、子树部分。

考虑割掉一个点,什么样的“块”是连通的:由于没有横叉边,因此只有可能是子树“块”与父树“块”相连,然后它们可以连通。即只有所有与父树相连的连通块是相互连通的。

那么就相当于把能够连通的“块”看作1个“块”,于是任意两个不同“块”中的点都是不连通的。

于是就可以将总的点对数减去在同一“块”(这里的“块”指合并以后的)得到答案:$ANS_i=C_n^2-\sum C_{si}^2$。

最后答案需要乘以2,因为题目中的点对是有序点对,需要计算2次。

#include <cstdio>
#include <algorithm>
#define N 100010
#define M 1000010
#define C(n) (((ll)(n) * (n - 1)) >> 1)
using namespace std;
typedef long long ll;
struct edge
{
int to , next;
}a[M];
int n , head[N] , cnt , deep[N] , low[N] , si[N] , num[N];
ll sum[N];
inline void add(int x , int y)
{
a[++cnt].to = y , a[cnt].next = head[x] , head[x] = cnt;
}
void dfs(int x , int fa)
{
int i , ts = 0;
si[x] = 1;
for(i = head[x] ; i ; i = a[i].next)
{
if(a[i].to == fa) continue;
if(!deep[a[i].to])
{
deep[a[i].to] = low[a[i].to] = deep[x] + 1 , dfs(a[i].to , x) , low[x] = min(low[x] , low[a[i].to]) , si[x] += si[a[i].to];
if(low[a[i].to] < deep[x]) ts += si[a[i].to];
else sum[x] += C(si[a[i].to]);
}
else low[x] = min(low[x] , deep[a[i].to]);
}
sum[x] += C(ts + n - si[x]);
}
int main()
{
int m , x , y , i;
scanf("%d%d" , &n , &m);
ll s = C(n);
for(i = 1 ; i <= m ; i ++ ) scanf("%d%d" , &x , &y) , add(x , y) , add(y , x);
deep[1] = 1 , dfs(1 , 0);
for(i = 1 ; i <= n ; i ++ ) printf("%lld\n" , (s - sum[i]) << 1);
return 0;
}

【bzoj1123】[POI2008]BLO DFS树的更多相关文章

  1. 【dfs+连通分量】Bzoj1123 POI2008 BLO

    Description Byteotia城市有n个 towns m条双向roads. 每条 road 连接 两个不同的 towns ,没有重复的road. 所有towns连通. Input 输入n&l ...

  2. BZOJ1123: [POI2008]BLO

    1123: [POI2008]BLO Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 614  Solved: 235[Submit][Status] ...

  3. BZOJ1123:[POI2008]BLO(双连通分量)

    Description Byteotia城市有n个 towns m条双向roads. 每条 road 连接 两个不同的 towns ,没有重复的road. 所有towns连通. Input 输入n&l ...

  4. bzoj1123 [POI2008]BLO——求割点子树相乘

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1123 思路倒是有的,不就是个乘法原理吗,可是不会写...代码能力... 写了一堆麻麻烦烦乱七 ...

  5. BZOJ1123 [POI2008]BLO(割点判断 + 点双联通缩点size)

    #include <iostream> #include <cstring> #include <cstdio> using namespace std; type ...

  6. [BZOJ1123]:[POI2008]BLO(塔尖)

    题目传送门 题目描述 Byteotia城市有n个towns.m条双向roads.每条road连接两个不同的towns,没有重复的road.所有towns连通. 输入格式 输入n,m及m条边. 输出格式 ...

  7. 【bzoj1123】BLO

    1123: [POI2008]BLO Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2222  Solved: 1090[Submit][Status ...

  8. 【BZOJ-1123】BLO Tarjan 点双连通分量

    1123: [POI2008]BLO Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 970  Solved: 408[Submit][Status][ ...

  9. BZOJ 1123: [POI2008]BLO

    1123: [POI2008]BLO Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1030  Solved: 440[Submit][Status] ...

随机推荐

  1. yarn的学习之1-架构

    本文翻译自http://hadoop.apache.org/docs/r2.8.0/hadoop-yarn/hadoop-yarn-site/YARN.html 译注:原文说得有些过于简单的,并且有些 ...

  2. MySQL高可用之MGR安装测试(续)

      Preface       I've implemented the Group Replication with three servers yesterday,What a shame it ...

  3. C调用约定__cdecl、__stdcall、__fastcall、__pascal分析

    参考原文地址:https://www.cnblogs.com/yenyuloong/p/9626658.html C/C++ 中不同的函数调用规则会生成不同的机器代码,产生不同的微观效果,接下来让我们 ...

  4. java中方法的参数传递机制_一个对象被当作参数传递到一个方法后

    一个例子: 在Boy.java类中 在Girl.java类中      在marry方法中的this指的是这个方法所属的对象的引用,在这里指的是girl这个对象 在BoyGirlTest.java测试 ...

  5. 谭浩强C语言第四版第九章课后习题7--9题(建立,输出,删除,插入链表处理)

    #include<stdio.h> #include<stdlib.h> #define N sizeof(link) typedef struct stu { struct ...

  6. (数据科学学习手札33)基于Python的网络数据采集实战(1)

    一.简介 前面两篇文章我们围绕利用Python进行网络数据采集铺垫了很多内容,但光说不练是不行的,于是乎,本篇就将基于笔者最近的一项数据需求进行一次网络数据采集的实战: 二.网易财经股票数据爬虫实战 ...

  7. [Python 3.X]python练习笔记[2]-----用python实现七段数码管显示年月日

    #SevenDigitsDrawV2.py import turtle import time def drawGap(i):#绘制数码管间隔 turtle.penup() turtle.fd(i) ...

  8. Git中从远程的分支获取最新的版本到本地——两种命令

    Git中从远程的分支获取最新的版本到本地有这样2个命令: 1. git fetch:相当于是从远程获取最新版本到本地,不会自动merge Git fetch origin master git log ...

  9. struts2官方 中文教程 系列十一:使用XML进行表单验证

    在本教程中,我们将讨论如何使用Struts 2的XML验证方法来验证表单字段中用户的输入.在前面的教程中,我们讨论了在Action类中使用validate方法验证用户的输入.使用单独的XML验证文件让 ...

  10. P1189 SEARCH(逃跑的拉尔夫)

    P1189 SEARCH 题目描述 年轻的拉尔夫开玩笑地从一个小镇上偷走了一辆车,但他没想到的是那辆车属于警察局,并且车上装有用于发射车子移动路线的装置. 那个装置太旧了,以至于只能发射关于那辆车的移 ...