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
???关键在于如何快速求出每个联通块的大小。
???可以在求割点时求出联通块的大小,最后答案累加即可。

代码如下:

#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;

const int maxn = 500005;
int n, m, dfn[maxn], low[maxn], num, size[maxn];
int cnt, nxt[maxn * 2], hed[maxn * 2], to[maxn * 2];
ll ans[maxn];

int read(void) {
    char c; while (c = getchar(), c < '0' || c >'9'); int x = c - '0';
    while (c = getchar(), c >= '0' && c <= '9') x = x * 10 + c - '0'; return x;
}

void add(int x, int y) {
    nxt[++ cnt] = hed[x]; hed[x] = cnt; to[cnt] = y;
}

void tarjan(int u) {
    dfn[u] = low[u] = ++ num;
    size[u] = 1;
    int tot = 0;
      for (int i = hed[u]; i ; i = nxt[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] += 1ll * tot * size[v];
                    tot += size[v];
                  }
            }
          else low[u] = min(low[u], dfn[v]);
      }
    ans[u] += 1ll * tot *(n - tot - 1); //其它所有点也是一个联通块
}

int main() {
    n = read(); m = read();
      for (int i = 1; i <= m; ++ i) {
        int x = read(), y = read();
        add(x, y); add(y, x);
      }
    tarjan(1);
      for (int i = 1; i <= n; ++ i) printf("%lld\n", (ans[i] + n - 1) << 1);
    return 0;
} 

原文地址:https://www.cnblogs.com/Gaxc/p/9960211.html

时间: 2024-08-29 01:35:51

bzoj1123: [POI2008]BLO(割点)的相关文章

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个点去掉,将有多

【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的子树是互相独立的,反向边也只会往上连. 那么对于

【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个数,代表如果把第

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个数,代表如果把

[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个数,代表如果把

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个数

P3469 [POI2008]BLO-Blockade 割点 tarjan

题意 给定一个无向图,问删掉点i,图中相连的有序对数.(pair<x, y> , x != y);求每个点对应的答案 思路 首先我们可以发现,如果这个点不是割点,那么答案就是n-1,如果是割点,就要考虑子树中的联通块.可以用tarjan,O(n)的复杂度 #include <algorithm> #include <iterator> #include <iostream> #include <cstring> #include <cstd

tarjan

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

【搭楼】大力开刷图论

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