题目传送门


题目描述

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


输入格式

输入n,m及m条边。


输出格式

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


样例

样例输入:

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

样例输出:

8
8
16
14
8


题解

看到这道题,应该想到缩点。

首先,如果一个点不是割点,那么把它去掉,不会影响与它无关的点对,那么,去掉它之后,减少的点对的个数即为2n-2。

如果这个点是割点,那么去掉它,减少的点对个数不止2n-2,还需要将所有与他它通的联通块的大小两两相乘再相加。

考虑塔尖,在深度优先遍历的同时就能够完成统计答案的工作。

那么,删除一个割点后,减少的点对数量即为:

$ size[ s_{1} ]×(n-size[ s_{1} ])+size[ s_{2} ]×(n-size[ s_{2} ])+...+size[ s_{t} ]×(n-size[ s_{t} ])+n-1+(n-1- \sum \limits_{k=1}^{t} size[ s_{k} ])×(1+ \sum \limits_{k=1}^{t} size[ s_{k} ])$


代码时刻

#include<bits/stdc++.h>
using namespace std;
struct rec
{int nxt;int to;
}e[1000001];
int head[100001],cnt;
int n,m;
int dfn[100001],low[100001],size[100001],tot;
long long ans[100001];
bool cut[100001];
void add(int x,int y)
{e[++cnt].nxt=head[x];e[cnt].to=y;head[x]=cnt;
}
void tarjan(int x)
{dfn[x]=low[x]=++tot;int flag=0,sum=0;size[x]=1;for(int i=head[x];i;i=e[i].nxt){if(!dfn[e[i].to]){tarjan(e[i].to);size[x]+=size[e[i].to];low[x]=min(low[x],low[e[i].to]);if(low[e[i].to]>=dfn[x]){flag++;sum+=size[e[i].to];//用来最后的∑ans[x]+=1LL*size[e[i].to]*(n-size[e[i].to]);//先统计进去if(x!=1||flag>1)cut[x]=1;}}else low[x]=min(low[x],dfn[e[i].to]);}if(cut[x])ans[x]+=1LL*(n-sum-1)*(sum+1)+n-1;//如果是割点else ans[x]=2*n-2;//如果不是割点
}
int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=m;i++){int x,y;scanf("%d%d",&x,&y);if(x==y)continue;add(x,y);add(y,x);}tarjan(1);for(int i=1;i<=n;i++)printf("%lld\n",ans[i]);return 0;
}


rp++

转载于:https://www.cnblogs.com/wzc521/p/11186754.html

[BZOJ1123]:[POI2008]BLO(塔尖)相关推荐

  1. BZOJ1123 [POI2008]BLO

    tarjan求割点,乘法原理统计答案,对数答案翻倍. By:大奕哥 1 #include<bits/stdc++.h> 2 using namespace std; 3 const int ...

  2. bzoj1123 [POI2008]BLO 圆方树

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

  3. [BZOJ1123][POI2008]BLO(tarjan求点双+树形dp)

    题目描述 传送门 题目大意:给出一个n个点m条边的无向连通图,问去掉每一个点之后存在多少点对不连通. 题解 tarjan求点双联通分量,对于每一个点双建立一个虚拟的节点,然后将这个点双的所有节点都连接 ...

  4. 1123: [POI2008]BLO

    1123: [POI2008]BLO Time Limit: 10 Sec  Memory Limit: 162 MB 链接:https://www.lydsy.com/JudgeOnline/pro ...

  5. bzoj 1123: [POI2008]BLO(Trajan求割点)

    1123: [POI2008]BLO Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 1468  Solved: 678 [Submit][Statu ...

  6. 【bzoj1123】BLO

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

  7. 【BZOJ1123】 [POI2008]BLO (tarjan)

    tarjan判断割点...拿掉一个点之后,会被分成若干个联通块,用节点个数和统计一下他们相互不能到达的个数就好. 1 const maxn=100419; 2 maxm=1000419; 3 type ...

  8. 【bzoj1123】[POI2008]BLO

    *题目描述: Byteotia城市有n个 towns m条双向roads. 每条 road 连接 两个不同的 towns ,没有重复的road. 所有towns连通. *输入 输入n<=1000 ...

  9. 【BZOJ1123】[POI2008]BLO【割顶】

    [题目链接] 题意可见discuss. 用Tarjan求割顶,然后对割顶的所有子树求点对个数(前缀和扫一遍),最后把自身和其他点的答案加上. 没注意边,数组开小了. /* Pigonometry */ ...

最新文章

  1. 与女儿谈商业模式 (3):沃尔玛的成功模式
  2. 零基础可以学python吗-零基础可以学会python吗?python好学吗?
  3. C++下简单的socket编程
  4. bike with a famous logo
  5. HMM——前向后向算法
  6. Java高级篇(二)——网络通信
  7. 433M无线串口E30-TTL-100在农业物联网上的应用
  8. reportgen :python生产pptx
  9. Direct3D Frustum裁剪原理
  10. Linux安装卸载Mysql数据库
  11. 什么是JDK JRE JVM?
  12. 根据学生名单(excel文件)对QQ群成员进行统计(助教可能会需要)
  13. Verilog常用语法
  14. Bypass个人原创文章汇总
  15. FFmpeg采集树莓派USB摄像头(UVC摄像头)
  16. 用matlab求一组数据的分布函数,求任意一组数据的概率密度函数
  17. Python趣味|为了追到小姐姐,我用 Python 制作了一个机器人
  18. 甜椒刷机助手(安卓一键刷机助手) v3.5.1.1 电脑版
  19. IGWO-SVM:改良的灰狼优化算法改进支持向量机。 采用三种改进思路:两种Logistic和Tent混沌映射和采用DIH策略
  20. ROS学习----依据ROS入门教程,整理的ROS命令

热门文章

  1. Serverless 音视频转码 —— 芒果 TV 落地实践(下)
  2. 计算机组成--虚拟内存技术
  3. 离散数学 --- 谓词逻辑 --- 谓词与量词的引入
  4. xp系统登录密码总是提示错误
  5. Closure call with mismatched arguments: function ‘routes.<anonymous closure>‘
  6. 有知道这个是什么异常吗? 要怎么解决cn.hutool.json.JSONException: Mismatched hr and body at 171 [character 6 line 6]
  7. 15---文件上传与下载
  8. 让AI“读懂”短视频,爱奇艺内容标签技术解析
  9. 7、XPOSED三、在靠谱助手上使用
  10. C.哦~唔西迪西小姐~(贪心,stl)