tarjan + DP_tree <战争游戏>

来源:互联网 发布:图书在版编目数据 编辑:程序博客网 时间:2024/05/17 22:16

3896. 【NOIP2014模拟10.26】战争游戏 (Standard IO)

Time Limits: 1000 ms  Memory Limits: 262144 KB     

题目大意

n个点,m条无向边连成一个连通图。求对于任一点i,若把i删除,有多少点对无法互相到达。


Input

第一行n,m
2....m+1行,每行u v,表示u,v有一条边相连

Output

n行,第i行表示若将i删除,有多少点对不连通(包括i)

Sample Input

7 9
1 2
1 3
1 4
1 5
1 6
1 7
2 3
4 5
6 7

Sample Output

18
6
6
6
6
6
6

Data Constraint

 n<=50000;m<=100000



解法::

tarjan+树形dp

缩点双联通分量,然后在树上计算。
实际上可以在 tarjn 的时候顺便处理,要注意 i 是割点不代表删了 i, 的子孙跟父亲都
断了(具体见 game1.cp)。
考虑点与点之间必须经过的只有割点,如果在同一个点双联通分量中的话,则没有必
经的点,那么我们只需要把所有的点双联通分量缩点,之后形成一棵树的结构,在树上计算
经过每个点的点对数量,dp解决。


让我介绍下tarjan求割点吧

选任一点dfs,设dfn[i]为点i的遍历序号

low[i]为不通过i的父节点可以追溯到的序号最小的节点。

显然low[i]=min(dfn[i],low[j])  && j!=i_father&&connect[i][j]=1


对于点u,v

if(dfn[u]<=low[v]) 

u为割点。


dp很简单详见程序



 

0 0