P3469 [POI2008]BLO-Blockade(tarjan搜索树)

news/2024/7/1 9:16:07

LINK

使用 t a r j a n tarjan tarjan求出割点,显然非割点的答案是 2 ∗ ( n − 1 ) 2*(n-1) 2(n1)

如果是割点,割掉之后,会把原图分成若干个连通块

下面的讨论暂时不计算点 u u u的贡献

考虑在 t a r j a n tarjan tarjan形成的 d f s dfs dfs树中

u u u的儿子分别是 v 1 , v 2 , v 3 . . . v_1,v_2,v_3... v1,v2,v3...,子树大小分别是 s i z [ v 1 ] , s i z [ v 2 ] , s i z [ v 3 ] . . . siz[v_1],siz[v_2],siz[v_3]... siz[v1],siz[v2],siz[v3]...

这些儿子中,有些儿子的 l o w [ v ] > = d f n [ u ] low[v]>=dfn[u] low[v]>=dfn[u]

说明这些儿子不能通过非父回边到达更浅的节点,也就是被分割为一个连通块

那么直接计算这个儿子的贡献,为 s i z [ v ] ∗ ( n − 1 − s i z [ v ] ) siz[v]*(n-1-siz[v]) siz[v](n1siz[v])

设这类儿子的总大小为 s u m sum sum,那么这些点到不了其余 ( n − 1 − s u m ) (n-1-sum) (n1sum)个点

加上贡献,最后加上点 u u u的贡献 2 ∗ ( n − 1 ) 2*(n-1) 2(n1)即可

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 2e6+10;
int n,m,id,dfn[maxn],low[maxn],siz[maxn],ans[maxn],cut[maxn];
struct edge{
	int to,nxt;
}d[maxn]; int head[maxn],cnt=1;
void add(int u,int v){ d[++cnt] = ( edge ){v,head[u]},head[u] = cnt; }
void tarjan(int u,int fa)
{
	dfn[u] = low[u] = ++id; siz[u] = 1;
	int child = 0,sum = 0;
	for(int i=head[u];i;i=d[i].nxt )
	{
		int v = d[i].to;
		if( !dfn[v] )
		{
			child++; tarjan(v,fa);
			siz[u] += siz[v];
			if( low[v]>=dfn[u] )//发现割点 
			{
				ans[u] += siz[v]*( n-siz[v]-1 );
				sum += siz[v];
				if( u!=fa )	cut[u] = 1;
			}
			low[u] = min( low[u],low[v] );
		}
		else	low[u] = min( low[u],dfn[v] );
	}
	if( child>=2 && u==fa )	cut[u] = 1;
	if( !cut[u] )	ans[u] = 2*(n-1);
	else	ans[u] += ( n-sum-1 )*sum+2*(n-1);
}
signed main()
{
	cin >> n >> m;
	for(int i=1;i<=m;i++)
	{
		int l,r; cin >> l >> r;
		add(l,r); add(r,l);
	}
	tarjan(1,1);
	for(int i=1;i<=n;i++)	cout << ans[i] << endl;
}

http://www.niftyadmin.cn/n/3620860.html

相关文章

ifconfig 工具

ifconfig 工具 ifconfig 命令常用格式 格式&#xff1a;ifconfig显示当前激活的网络接口信息。 格式&#xff1a;ifconfig {INTERFACE}显示指定网络接口的信息。比如&#xff1a;eth0, eth1。 格式&#xff1a;ifconfig -a显示所有网络接口的信息&#xff0c;无论是否激活。 格…

开学第六周.ONE(区间DP)

不知不觉已经第六周了&#xff0c;感觉什么都没学到似的&#xff0c;老师讲的东西有的我现在还没消化&#xff0c;以至于我感觉已经跟不上老师的进度&#xff0c;这其实很悲哀&#xff0c;对于DP的有些东西我还是理解不了&#xff0c;为什么这个状态转移方程可以这样写&#xf…

Expert 诊断优化系列------------------内存不够用么?

现在很多用户被数据库的慢的问题所困扰&#xff0c;又苦于花钱请一个专业的DBA成本太高。软件维护人员对数据库的了解又不是那么深入&#xff0c;所以导致问题迟迟不能解决&#xff0c;或只能暂时解决不能得到根治。开发人员解决数据问题基本又是搜遍百度各种方法尝试个遍&…

训练总结 18.7.17 暑假训练第二天

今日完成题量两道题&#xff0c;真是越来越少了。 所谓的思维题&#xff0c;实在是想不上。今天那个图形题&#xff0c;推规律只能推出一半&#xff0c;不看题解完全做不出来&#xff0c;比较凉。

Azure 基础:用 PowerShell 自动登录

PowerShell 是管理 Azure 的最好方式&#xff0c;因为我们可以使用脚本把很多的工作自动化。比如把 Azure 上的虚拟机关机&#xff0c;并在适当的时间把它开机&#xff0c;这样我们就能节省一些开支&#xff0c;当然我们同时也为减少二氧化碳的排放做出了贡献&#xff01; Powe…

LeetCode 第657题 机器人能否返回原点

在二维平面上&#xff0c;有一个机器人从原点 (0, 0) 开始。给出它的移动顺序&#xff0c;判断这个机器人在完成移动后是否在 (0, 0) 处结束。移动顺序由字符串表示。字符 move[i] 表示其第 i 次移动。机器人的有效动作有 R&#xff08;右&#xff09;&#xff0c;L&#xff08…

爱因斯坦难题

爱因斯坦曾经提出过这样一道有趣的数学题&#xff1a;有一个长阶梯&#xff0c;若每步上2阶&#xff0c;最后剩下1阶&#xff1b;若每步上3阶&#xff0c;最后剩2阶&#xff1b;若每步上5阶&#xff0c;最后剩下4阶&#xff1b;若每步上6阶&#xff0c;最后剩5阶&#xff1b;只…

laravel5.1 使用队列发送邮件

为什么80%的码农都做不了架构师&#xff1f;>>> 首先在.env文件下设定队列的驱动 QUEUE_DRIVER databaselaravel5.1提供了6种驱动,sync,databse,beanstalkd,sqs,iron,redis具体可以在官方手册查阅. 本次选用database作为驱动 php cli下执行 php artisan queue:tab…