首页 > 其他分享 >洛谷 P3469 BLO-Blockade

洛谷 P3469 BLO-Blockade

时间:2024-09-05 08:52:00浏览次数:7  
标签:洛谷 fa siz sum 1ll Blockade BLO dfn low

洛谷 P3469 BLO-Blockade

题意

给定一张无向图,求每个点被封锁之后有多少个有序点对 \((x,y)(x \ne y,1<=x,y<=n)\) 满足 \(x\) 无法到达 \(y\)。

思路

使用 Tarjan 求出割点,有以下几种情况。

  1. 当前点不是割点,答案为 \(2\times (n-1)\),即该点与其他所有点不连通。
  2. 当前点是割点,答案由两部分组成,一是 dfs 树上儿子两两之间不连通,二是 dfs 树上子树内和子树外不连通,答案为 \(\sum_{v \in son_u} siz_{v} \times(n-siz_v)+(n-1)+(n-\sum_{v \in son_u}siz_v - 1)\times(\sum_{v \in son_u}siz_v + 1)\)。

注意要加上本身与其他点不连通,\(son\) 只算删除当前点后与外部不连通的点,即 \(low_v \ge dfn_u\) 的点 \(v\) 。

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 + 5, M = 5e5 + 5;
int tot, ver[M << 1], nxt[M << 1], head[N];
int n, m, low[N], dfn[N], siz[N], cnt;
ll ans[N]; bool g[N];
void add(int x, int y) {
	ver[++ tot] = y;
	nxt[tot] = head[x];
	head[x] = tot;
}
void tarjan(int x, int fa) {
	low[x] = dfn[x] = ++ cnt, siz[x] = 1;
	int s = 0, sum = 0;
	for (int i = head[x], y; i; i = nxt[i]) {
		y = ver[i];
		if (!dfn[y]) {
			tarjan(y, x);
			siz[x] += siz[y];
			if (low[y] >= dfn[x] && fa) g[x] = 1;
			if (low[y] >= dfn[x] || !fa) 
				ans[x] += 1ll * siz[y] * (n - siz[y]), sum += siz[y];
			low[x] = min(low[x], low[y]), s ++;
		} else if (y != fa) 
			low[x] = min(low[x], dfn[y]);
	}
	if (!fa && s >= 2) g[x] = 1;
	if (!g[x]) ans[x] = 2ll * (n - 1);
	else ans[x] += 1ll * n - 1ll + 1ll * (sum + 1) * (n - sum - 1);
}
int main() {
	scanf("%d%d", &n, &m);
	for (int i = 1, u, v; i <= m; i ++) {
		scanf("%d%d", &u, &v);
		add(u, v), add(v, u);
	}
	tarjan(1, 0);
	cerr << "g: ";
	for (int i = 1; i <= n; i ++) 
		if (g[i]) cerr << i << ' ';
	cerr << '\n';
	for (int i = 1; i <= n; i ++) 
		printf("%lld\n", ans[i]);
	return 0;
}

标签:洛谷,fa,siz,sum,1ll,Blockade,BLO,dfn,low
From: https://www.cnblogs.com/maniubi/p/18397660

相关文章

  • 洛谷刷题之P1046
    [NOIP2005普及组]陶陶摘苹果题目描述陶陶家的院子里有一棵苹果树,每到秋天树上就会结出101010个苹果。苹果成熟的时候,陶陶就会跑去摘苹果。陶陶有个......
  • 洛谷刷题之P1009
    [NOIP1998普及组]阶乘之和题目描述用高精度计算出S=1!+2......
  • 洛谷刷题之P1226
    【模板】快速幂题目描述给你三个整数a,b,pa,b,p......
  • 洛谷 P2515 软件安装
    洛谷P2515软件安装题意现在我们的手头有\(N\)个软件,对于一个软件\(i\),它要占用\(W_i\)的磁盘空间,它的价值为\(V_i\)。我们希望从中选择一些软件安装到一台磁盘容量为\(M\)计算机上,使得这些软件的价值尽可能大(即\(V_i\)的和最大)。但是现在有个问题:软件之间存在依赖......
  • 洛谷 P3119 Grass Cownoisseur G
    洛谷P3119GrassCownoisseurG题意约翰有\(n\)块草场,编号\(1\)到\(n\),这些草场由若干条单行道相连。奶牛贝西是美味牧草的鉴赏家,她想到达尽可能多的草场去品尝牧草。贝西总是从\(1\)号草场出发,最后回到\(1\)号草场。她想经过尽可能多的草场,贝西在通一个草场只吃一次......
  • 洛谷 P9912 Zatopljenje
    洛谷P9912Zatopljenje题意给出长度为\(n\)的序列\(a\),有\(q\)次询问。每次给出\(l,r,x\),询问区间\([l,r]\)中有多少段极长的,\(a\)都大于\(x\)的段。思路离线后扫描线。先把询问和\(a\)离散化,然后扫描\(a\)的值。维护序列\(b\),初始全为\(1\)。扫描从\(......
  • 洛谷 P5340 大中锋的游乐场
    洛谷P5340大中锋的游乐场题意给出一张\(n\)个点\(m\)条边的图,每个点有一个点权\(1\)或\(-1\)。给出点\(s,t\),求出\((s,t)\)间满足以下条件的最短路。任意时刻,走过的路径上点权和均\(\in[-k,k]\)。思路分层图最短路。\(dis_{i,j}\)表示走到\(i\),点权和为\(j......
  • 洛谷 P5618 堵塞的交通
    洛谷P5618堵塞的交通题意有一个\(2\timesC\)的网格图,需要维护\(3\)种操作。连接相邻的两个格子。将相邻的两个格子断开连接。询问两个格子是否联通。思路1考虑分块。连边时块内使用并查集维护,块与块之间用数组标记。删边块内的边时暴力重构并查集,块之间的边清零......
  • Java 入门指南:Java 并发编程 —— 并发容器 PriorityBlockingQueue
    BlockingQueueBlockingQueue是Java并发包(java.util.concurrent)中提供的一个阻塞队列接口,它继承自Queue接口。BlockingQueue中的元素采用FIFO的原则,支持多线程环境并发访问,提供了阻塞读取和写入的操作,当前线程在队列满或空的情况下会被阻塞,直到被唤醒或超时。常用的......
  • 洛谷 B3645 数列前缀和 2 题解
    前缀知识:枚举,费马小定理,逆元,线性乘法逆元,线段树(?)。解法1:暴力如题。暴力枚举即可,30分。由于太简单,不给代码。解法2:前缀积+费马小定理+逆元由于涉及静态区间,可以想到前缀积。前缀积公式为\(q_r/q_{l-1}\),除法恰好可以用逆元来算。直接写即可。不会超时,因为时间为\(O(n\logp)\)......