1123: [POI2008]BLO

1123: [POI2008]BLO

Time Limit: 10 Sec  Memory Limit: 162 MB
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1123

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

题意叙述不清。

题目大意:给定N个点M条边的无向图,问删除每个点后,对于有序数对(x,y)满足x,y互不连通的数对数。其中,被删掉的点也应被统计。

这种和删点,联通有关的,可以考虑割点/点双联通分量。

题解:这一题中蕴含的技巧就是求割点时计算其将图分成了多少个大小为多少的连通块。 
因为答案就是这些连通块大小互相乘的和。 
关键在于,再求割点时维护一个vis[i]代表搜索树中这个子树的大小。 
因为一个割点将图分成的连通块是其下面的所有子树(互不相连)与这个点上面的所有点。tmp表示这个点的子树之前的同父亲子树的和。为什么这么算可以得到答案,可以自己推一推。 
不要忘记最后答案要乘2。

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 100005, maxm = 1000005;
int n,m,dfn[maxn],tot,low[maxn],idx,h[maxn];
ll siz[maxn], ans[maxn];
struct edge{
    int v,nxt;
}G[maxm];
void add(int u, int v){
    G[++tot].v = v;G[tot].nxt = h[u]; h[u] = tot;
}

void tarjan(int u, int f){
    dfn[u] = low[u] = ++idx;
    siz[u] = 1;
    ll t = 0;
    for(int i = h[u]; i; i = G[i].nxt){
        int v = G[i].v;
        if(v == f)continue;
        if(dfn[v])low[u] = min(low[u], dfn[v]);
        else {
            tarjan(v, u);
            low[u] = min(low[u], low[v]);
            siz[u] += siz[v];
            if(dfn[u] <= low[v]){//

                ans[u] += siz[v] * t;
                t += siz[v];
            }
        }
    }
    ans[u] += (n - t - 1) * t;
}

int main(){
    scanf("%d%d",&n,&m);
    for(int i = 1; i <= m; i++){
        int u, v;
        scanf("%d%d",&u,&v);
        add(u, v); add(v, u);
    }
    for(int i = 1; i <= n; i++)
        if(!dfn[i])tarjan(i, -1);
    for(int i = 1; i <= n; i++)
        printf("%lld\n",(ans[i]+n-1)*2);
}

原文地址:https://www.cnblogs.com/EdSheeran/p/9029346.html

时间: 2024-11-10 01:01:55

1123: [POI2008]BLO的相关文章

BZOJ 1123: [POI2008]BLO

1123: [POI2008]BLO Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1030  Solved: 440[Submit][Status][Discuss] Description Byteotia城市有n个 towns m条双向roads. 每条 road 连接 两个不同的 towns ,没有重复的road. 所有towns连通. Input 输入n<=100000 m<=500000及m条边 Output 输出n个数,代表如果把

BZOJ1123: [POI2008]BLO

1123: [POI2008]BLO Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 614  Solved: 235[Submit][Status] Description Byteotia城市有n个 towns m条双向roads. 每条 road 连接 两个不同的 towns ,没有重复的road. 所有towns连通. Input 输入n<=100000 m<=500000及m条边 Output 输出n个数,代表如果把第i个点去掉,将有多

[POI2008]BLO

1123: [POI2008]BLO Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1519  Solved: 697[Submit][Status][Discuss] Description Byteotia城市有n个 towns m条双向roads. 每条 road 连接 两个不同的 towns ,没有重复的road. 所有towns连通. Input 输入n<=100000 m<=500000及m条边 Output 输出n个数,代表如果把

【dfs+连通分量】Bzoj1123 POI2008 BLO

Description Byteotia城市有n个 towns m条双向roads. 每条 road 连接 两个不同的 towns ,没有重复的road. 所有towns连通. Input 输入n<=100000 m<=500000及m条边 Output 输出n个数,代表如果把第i个点去掉,将有多少对点不能互通. Solution 求割顶的一系列操作不仅可以用来求割顶,也可以解决很多问题,比如这道题. dfs是很神奇的,对于节点u能扩展出去的v的子树是互相独立的,反向边也只会往上连. 那么对于

bzoj1123: [POI2008]BLO(割点)

bzoj1123 题目描述:给定n个城市,m条边,每条边连接两个不同的城市,没有重复的路,所有的城市相连. 输入格式:输入n<=100000 m<=500000 及 m 条边 输出格式:输出 n 个数,代表如果把第 i 个点去掉,将有多少对点不能互通. 输入样例: 5 5 1 2 2 3 1 3 3 4 4 5 输出样例: 8 8 16 14 8 解析:把每个点去掉,对答案的贡献就是每个被分割出的联通块的的大小之积 + (n - 1) 再乘2 ???关键在于如何快速求出每个联通块的大小. ??

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

1123: [POI2008]BLO Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 970  Solved: 408[Submit][Status][Discuss] Description Byteotia城市有n个 towns m条双向roads. 每条 road 连接 两个不同的 towns ,没有重复的road. 所有towns连通. Input 输入n<=100000 m<=500000及m条边 Output 输出n个数,代表如果把第

tarjan

首先还是说明这是一个坑 然后tarjan以前一直处于懵懵懂懂的状态,决定痛改前非好好学. tarjan可以用来求强联通分离. 它有两个数组,一个是dfn,一个是low. 定义DFN(u)为节点u搜索的次序编号(时间戳).Low(u)为u或者u的子树能够追溯到的最早的栈中的节点的次序号. 然后就发现u的儿子无非三种情况:一是还没访问过,然后是访问过而且已经在某个强联通分量里面,最好是访问过但是还在栈里面. 对于第一种情况就直接访问 然后low[u]=min(low[u],low[son]) 对于第

大神刷题表

9月27日 后缀数组:[wikioi3160]最长公共子串 dp:NOIP2001统计单词个数 后缀自动机:[spoj1812]Longest Common Substring II [wikioi3160]最长公共子串 [spoj7258]Lexicographical Substring Search 扫描线+set:[poj2932]Coneology 扫描线+set+树上删边游戏:[FJOI2013]圆形游戏 结论:[bzoj3706][FJ2014集训]反色刷 最小环:[poj1734

【搭楼】大力开刷图论

写在前面 继前半个月的刷杂题后,学OI的感觉找到了些,于是来刷专题吧! 感觉我接触图论到现在也有一个学期了,然而感觉我还没有系统地搞过图论或者说我是一个图论还没有入门的人>.< 刷图论主要做三件事: ①大白大白: ②BzojBzoj: ③紫书的习题: 我理想的进度安排是: 6.4-6.10搞完除网络流部分,然后开刷网络流,因为现在还没有开始网络流也不知道是什么情况. 知识刷的顺序就按照大白的来. 图的连通 ——DFS遍历,割顶,桥,双连通分量,强连通分量 DFS遍历 DFS的神奇之处是什么呢,