Description

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

Input

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

Output

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

Sample Input

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

Sample Output

8
8
16
14
8

【题前话】

这题真的害人不浅啊!

本蒟蒻怀着做板子题1A的心态打开这道题,结果经过了三个多小时,经历了又A又RE又WA又栈溢出的代码,终于在机房大佬的题解和讲解之下终于AC了,RE和栈溢出的原因竟是因为一个变量开了long long!必须定义时定义int,乘的时候改为long long才能A!

本蒟蒻都惊到了,果然计算机是一个玄学的学科,对萌新真的很不友好!我到现在还是不明白,如果有路过大佬能解答我的疑惑的,在下感激不尽!(具体是哪个变量我会在题外话里写出)

【题解】

首先,大家应该都知道,这道题是用TARJAN算法的。(没学过的小盆友可以去学习一发:https://www.cnblogs.com/mxrmxr/p/9715579.html)

有的人或许觉得这道题是TARJAN缩点,其实不然。这道题是用TARJAN求割点的。具体思路如下:

打一个TARJAN模板,按照DFS树搜索,DFS返回后,判断当前点是不是割点,如果是的话,那么这个点和刚才搜索的点就是一个联通块。

那我们怎么处理有多少对点呢?

其实很简单,就是乘法原理,相信大家都学过吧。(没学过的出门右转去语文竞赛吧)

总体思路如下:

对于每个割点,它的儿子们肯定有至少两个联通块,如果这个割点被删除,下面的联通块都不会互通。我们定义ans[u]为这个点去掉后有多少点不能互通,我们在计算每个它下面的联通块时,把它们的大小依次乘起来(就是下面的核心代码,这里看不懂就先往下翻)。然后,再加上它儿子们的联通块的和乘以他父亲们所有点的和,(就是乘法原理啦)这样,我们的思路就基本结束了。

上文的核心代码是怎么写的呢?如下:

if(low[v]>=dfn[u])
{
ans[u]+=(ll)sum*size[v];
sum+=size[v];
}

我们定义size代表以u为根的联通块大小,sum表示已经遍历的子联通块,当我们发现一个新的联通块时,要把sum的大小乘以已经遍历的(乘法原理),就是size[v]啦。这时我们又遍历了一个,所以sum要加上它。(就是size[v] 啦)

总代码如下:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cstdlib>
using namespace std;
#define MAXN 1000010
#define num ch-'0'
#define ll long long
void get(int &res)
{
char ch;bool flag=;
while(!isdigit(ch=getchar()))
(ch=='-')&&(flag=true);
for(res=num;isdigit(ch=getchar());res=res*+num);
(flag)&&(res=-res);
}
int n,m,tot=,cnt;
int hea[MAXN],nex[MAXN<<],to[MAXN<<];
int dfn[MAXN],low[MAXN],size[MAXN];
ll ans[MAXN<<];
inline void add(int a,int b)
{
to[++tot]=b;
nex[tot]=hea[a];
hea[a]=tot;
}
inline void tarjan(int u)
{
int sum=;
dfn[u]=low[u]=++cnt;
size[u]=;
for(int i=hea[u];i;i=nex[i])
{
int v=to[i];
if(!dfn[v])
{
tarjan(v);
size[u]+=size[v];
low[u]=min(low[u],low[v]);
if(low[v]>=dfn[u])
{
ans[u]+=(ll)sum*size[v];
sum+=size[v];
}
}
else low[u]=min(low[u],dfn[v]);
}
ans[u]+=(ll)sum*(n-sum-);
}
int main()
{
get(n),get(m);
for(int i=;i<=m;i++)
{
int a,b;
get(a),get(b);
add(a,b);add(b,a);
}
tarjan();
for(int i=;i<=n;i++)
printf("%lld\n",(ans[i]+n-)<<);
}

【题外话】

在写TARJAN时,我的sum(含义如上文所讲)如果int就会WA,如果long long就会RE和栈溢出,只有先定义为int,后面乘法时改为long long才能A。

本蒟蒻十分不解,还望请过路大神指点高明。

Blockade(Bzoj1123)的更多相关文章

  1. bzoj1123 Blockade

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

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

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

  3. BZOJ1123: [POI2008]BLO

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

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

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

  5. BLO(bzoj1123)

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

  6. 割顶树 BZOJ1123 BLO

    无向图中,求去掉点x[1,n]后每个联通块的大小. 考虑tarjan求bcc的dfs树,对于每个点u及其儿子v,若low[v]<prv[u],则v对u的父亲联通块有贡献,否则对u的子树有贡献.每 ...

  7. bzoj1123 割点性质应用

    删掉无向图上任意一点,请求出将会增加的不连通的点对数 将无向图联通性的问题转化到搜索树方向上考虑 如果一个点不是割点,那么删掉该点的答案很简单,就是2*(n-1) 如果点u是割点,同时u在搜索树上有t ...

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

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

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

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

随机推荐

  1. hdu 2899 Strange fuction——模拟退火

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=2899 还可三分.不过只写了模拟退火. #include<iostream> #include& ...

  2. Erlang pool management -- RabbitMQ worker_pool 2

    上一篇已经分析了rpool 的三个module , 以及简单的物理关系. 这次主要分析用户进程和 worker_pool 进程还有worker_pool_worker 进程之间的调用关系. 在开始之前 ...

  3. extjs控制器调用其他视图的函数实现控件赋值。

  4. Windows Server 2008 R2换SID要注意

    今天刚装Windows2008R2,准备做实验.同样,我对虚拟机采用了母盘和差异磁盘.在新建好的虚拟机上使用NewSID执行更新SID操作时,一切正常,但当更新完并重启进入系统后,竟然蓝屏了.   原 ...

  5. Springboot监控之一:SpringBoot四大神器之Actuator之3-springBoot的监控和管理--指标说明

    Spring Boot包含很多其他的特性,它们可以帮你监控和管理发布到生产环境的应用.你可以选择使用HTTP端点,JMX或远程shell(SSH或Telnet)来管理和监控应用.审计(Auditing ...

  6. 西安电子科技大学第16届程序设计竞赛 E Xieldy And His Password

    链接:https://www.nowcoder.com/acm/contest/107/E来源:牛客网 Xieldy And His Password 时间限制:C/C++ 1秒,其他语言2秒 空间限 ...

  7. iOS下拉图片放大

    效果图 开始简单的代码过程 其实思路很简单 就是 让tableView偏移 一图片的高度,然后在把图片添加到tableView中,然后再监听didScrollView,在里面改变图片的frame - ...

  8. JDBC---bai

    import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import ...

  9. Git学习笔记(三)远程库(GitHub)协同开发,fork和忽略特殊文件

    远程库 远程库,通俗的讲就是不再本地的git仓库!他的工作方式和我们本地的一样,但是要使用他就需要先建立连接! 远程库有两种,一个是自己搭建的git服务器:另一种就是使用GitHub,这个网站就是提供 ...

  10. ListView显示Sqlite的数据

    在安卓中,ListView和Sqlite都是十分常用的.这次我们来结合这个两个知识点写一个Demo. 功能:吧SQLite中的数据用ListView显示出来. 先看截图吧 首先是数据库 然后是运行截图 ...