LOJ10104Blockade
POI 2008
Byteotia 城市有 n 个城镇,m 条双向道路。每条道路连接两个不同的城镇,没有重复的道路,所有城镇连通。
输出 n 个数,代表如果把第i 个点去掉,将有多少对点不能互通。
输入格式
输入 n,m 及 m 条边。
输出格式
输出 n 个数,代表如果把第 i 个点去掉,将有多少对点不能互通。
样例
样例输入
5 5
1 2
2 3
1 3
3 4
4 5

样例输出
8
8
16
14
8
数据范围与提示
n<=1e5,m<=5e5。
______________________________________________________
tarjan算法,去掉某一点后产生的点对主要有三种:
1、u点和其他的点
2、u点下的各个子树内的点与其他的点(不含u)
3、u点下的所有子树外的点(可以理解为父亲方向上的子树,但包含于u点同双联通的点)到其他的点
______________________________________________________
1 #include<bits/stdc++.h>
2 using namespace std;
3 const int maxn=1e5+10;
4 const int maxm=5e5+10;
5 int n,m;
6 struct edge
7 {
8 int u,v,nxt;
9 bool ok;
10 }e[maxm<<1];
11 int head[maxn],js;
12 void addage(int u,int v)
13 {
14 e[++js].u=u;e[js].v=v;
15 e[js].nxt=head[u];head[u]=js;
16 }
17 int dfn[maxn],low[maxn],cnt,sz[maxn],ch[maxn];
18 long long ans[maxn];
19 int fx(int x)
20 {
21 return x&1?x+1:x-1;
22 }
23 void tarjan(int u)
24 {
25 dfn[u]=low[u]=++cnt;
26 sz[u]=1;
27 ans[u]=(n-1)<<1; //当前点与其他点之间的点对
28 for(int i=head[u];i;i=e[i].nxt)
29 if(!e[i].ok)
30 {
31 int v=e[i].v;
32 e[fx(i)].ok=1;
33 if(!dfn[v])
34 {
35 tarjan(v);
36 sz[u]+=sz[v];
37 low[u]=min(low[u],low[v]);
38 if(low[v]>=dfn[u])
39 {
40 ans[u]+=(long long)sz[v]*(n-sz[v]-1); //当前v节点为根的子树到树上其他点的点对(不包含u点)
41 ch[u]+=sz[v];
42 }
43 }
44 else low[u]=min(low[u],dfn[v]);
45 }
46 ans[u]+=(long long)(n-ch[u]-1)*ch[u]; //树去掉u为根的子树而产生的子树(不包含与u同双联通分量的点)中的点到到树中其他的点得点对
47 }
48 int main()
49 {
50 scanf("%d%d",&n,&m);
51 for(int u,v,i=0;i<m;++i)
52 {
53 scanf("%d%d",&u,&v);
54 addage(u,v);
55 addage(v,u);
56 }
57 tarjan(1);
58 for(int i=1;i<=n;++i)printf("%lld\n",ans[i]);
59 return 0;
60 }
LOJ10104Blockade的更多相关文章
随机推荐
- java集合大总结
Java集合大总结 java集合框架简图(API关系图): 虚线框表示接口,实线框表示类. 特点和使用总结: Collection: 单列单值. List: 有序(查询顺序和插入顺序一致),有下标(索 ...
- 【探索之路】机器人篇(2)-ROS系统并创建工作空间和项目
在ROS官网,已经给出了详细的教程.下面我就般一下砖,把相应的操作写到这里.官方网址:http://wiki.ros.org/cn/ 安装ROS系统 indigo在ubuntu上的安装教程.官网:ht ...
- 指令重排序 as-if-serial
笔者认为看完一本书或刚要了解完一个知识点 最好自己先运行一些DEMO 自己尝试着去了解下各种意思 这样知识点最终一定是你的.靠死记硬背的讨论或简单的粗暴的看下资料 脑子里肯定还是一团浆糊. p.p ...
- 一次MySQL死锁的排查记录
前几天线上收到一条告警邮件,生产环境MySQL操作发生了死锁,邮件告警的提炼出来的SQL大致如下. update pe_order_product_info_test set end_time = ' ...
- SSM整合详解
1.基本概念 1.1.Spring Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One ...
- 一、linux安装mysql
一.下载mysql免编译包: wget http://cdn.mysql.com/archives/mysql-5.6/mysql-5.6.33-linux-glibc2.5-x86_64.tar.g ...
- python 中的sum( )函数 与 numpy中的 sum( )的区别
一. python sum函数 描述: sum() 对序列进行求和 用法: sum(iterable[, start]) iterable:可迭代对象,例如,列表,元组,集合. start:指定相加的 ...
- 冷饭新炒:理解Redisson中分布式锁的实现
前提 在很早很早之前,写过一篇文章介绍过Redis中的red lock的实现,但是在生产环境中,笔者所负责的项目使用的分布式锁组件一直是Redisson.Redisson是具备多种内存数据网格特性的基 ...
- Docker踩过的坑
前言 主要是记录Docker遇到的坑,更多的是因为自己的粗心大意,以此警示 正文 Dockerfile里的RUN 某一次把启动服务的命令写在了 Dockerfile 中,后来发现服务一直拉不起来. 原 ...
- 【Java基础】多线程
多线程 基本概念 程序(program)是为完成特定任务.用某种语言编写的一组指令的集合.即指一段静态的代码,静态对象. 进程(process)是程序的一次执行过程,或是正在运行的一个程序.是一个动态 ...