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的更多相关文章

随机推荐

  1. java集合大总结

    Java集合大总结 java集合框架简图(API关系图): 虚线框表示接口,实线框表示类. 特点和使用总结: Collection: 单列单值. List: 有序(查询顺序和插入顺序一致),有下标(索 ...

  2. 【探索之路】机器人篇(2)-ROS系统并创建工作空间和项目

    在ROS官网,已经给出了详细的教程.下面我就般一下砖,把相应的操作写到这里.官方网址:http://wiki.ros.org/cn/ 安装ROS系统 indigo在ubuntu上的安装教程.官网:ht ...

  3. 指令重排序 as-if-serial

    笔者认为看完一本书或刚要了解完一个知识点  最好自己先运行一些DEMO 自己尝试着去了解下各种意思  这样知识点最终一定是你的.靠死记硬背的讨论或简单的粗暴的看下资料 脑子里肯定还是一团浆糊. p.p ...

  4. 一次MySQL死锁的排查记录

    前几天线上收到一条告警邮件,生产环境MySQL操作发生了死锁,邮件告警的提炼出来的SQL大致如下. update pe_order_product_info_test set end_time = ' ...

  5. SSM整合详解

    1.基本概念 1.1.Spring Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One ...

  6. 一、linux安装mysql

    一.下载mysql免编译包: wget http://cdn.mysql.com/archives/mysql-5.6/mysql-5.6.33-linux-glibc2.5-x86_64.tar.g ...

  7. python 中的sum( )函数 与 numpy中的 sum( )的区别

    一. python sum函数 描述: sum() 对序列进行求和 用法: sum(iterable[, start]) iterable:可迭代对象,例如,列表,元组,集合. start:指定相加的 ...

  8. 冷饭新炒:理解Redisson中分布式锁的实现

    前提 在很早很早之前,写过一篇文章介绍过Redis中的red lock的实现,但是在生产环境中,笔者所负责的项目使用的分布式锁组件一直是Redisson.Redisson是具备多种内存数据网格特性的基 ...

  9. Docker踩过的坑

    前言 主要是记录Docker遇到的坑,更多的是因为自己的粗心大意,以此警示 正文 Dockerfile里的RUN 某一次把启动服务的命令写在了 Dockerfile 中,后来发现服务一直拉不起来. 原 ...

  10. 【Java基础】多线程

    多线程 基本概念 程序(program)是为完成特定任务.用某种语言编写的一组指令的集合.即指一段静态的代码,静态对象. 进程(process)是程序的一次执行过程,或是正在运行的一个程序.是一个动态 ...