2024-03-17

2024-03-17

一开始先看了半个小时的 论战捆竹竿,然后放弃了,我太菜了
以为自己能切黑了,看来还是高估自己了……

我早晚把它做出来

BLO-Blockade

# 题意简述 #

有一张联通的无向图,对于每个点询问
将与这个点相连的所有边删除后有多少个有序的点对 \((x, y)\) 使得 \(x\)\(y\) 不能互相到达

删除与一个点相连的所有边其实就是删除这个点
删除之后原来的连通图会变成若干连通块
每个连通块内的所有点都不能到达这个连通块之外的所有点
每个点的答案就是删除这个点之后每个连通块的 \(siz \times (n-siz)\) 之和

不难发现若该点不是割点 这个值为 \(1 \times (n-1) + (n-1) \times (n-(n-1))=2 \times (n-1)\)

若这个点是割点可以在 Tarjan 的过程中统计答案
不要忘记除了这个节点下的某些子树是单独的连通分量之外,剩下的所有点还构成一个连通分量

写这道题的时候可能对 Tarjan 算法还没有理解透彻,并不是割点在搜索树中挂着的所有子树都是单独的连通分量,只有满足 low[v]>=dfn[u] 的才是,其他的和这个节点之上的部分是联通的 因此 \(sum\) 也不能用 \(siz[u]-1\) 来代替,而是要单独统计所有被隔断的子树的 siz 之和

有时间总结一下 Tarjan 算法们

感觉做了道大水板题啊但 还是算有点收获吧

#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;

typedef long long ll;

const int N=100010,M=10*N;

int n,m;

int hd[N],edg[M],nxt[M],idx;

void adde(int u,int v) {
	edg[idx]=v,nxt[idx]=hd[u],hd[u]=idx++;
}

ll ans[N];
int dfn[N],low[N],idt;
bool cut[N];
ll siz[N];

void Tarjan(int u) {
	dfn[u]=low[u]=++idt;
	siz[u]=1ll;
	int son=0;
	ll sum=0;
	for(int i=hd[u];~i;i=nxt[i]) {
		int v=edg[i];
		if(!dfn[v]) {
			Tarjan(v);
			low[u]=min(low[u],low[v]);
			siz[u]+=siz[v];
			if(low[v]>=dfn[u]) {
				son++;
				sum+=siz[v];
				ans[u]+=siz[v]*(n-siz[v]);	
				if(son>1||u!=1) cut[u]=true;
			}
		}
		else low[u]=min(low[u],dfn[v]);
	}
	if(cut[u]) ans[u]+=n-1ll+(n-sum-1)*(sum+1);
	else ans[u]=2ll*(n-1);
}

int main() {
	memset(hd,-1,sizeof(hd));
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++) {
		int u,v;
		scanf("%d%d",&u,&v);
		adde(u,v),adde(v,u);
	}
	Tarjan(1);
	for(int i=1;i<=n;i++) printf("%lld\n",ans[i]);
	
	return 0;
}

Grass Cownoisseur G

# 简述题意 #

一张有向图,从 \(1\) 出发回到 \(1\) ,最多逆行一次,最多经过多少个点

  1. 先不考虑逆行

想到缩点,然后将每个强连通分量缩点后的权值设为这个分量的点的个数
然后最长路(spfa)

  1. 考虑逆行

分层图
把图复制一份
第一层表示还没有逆行过
第二层表示已经逆行了
对于原图的每条边
在第一层的终点和第二层的起点之间连边,代表逆行

为什么不会重复走点呢?
一开始有个想法,就是原图 u->v 有边,原图和新图之间 v->u 有边,这样难道不会重复走 u 吗?

这种情况是不会发生的

  • 如果 u 和起点不在同一个强连通分量里
    那么走到新的 u 之后就不可能回到新图中的起点了

  • 如果 u 和起点在同一个强连通分量里
    由于我们是把这个点的权值放到了这个点的出边上
    所以最后回到新图上的起点时不会重复计算起点的权值

最后
如果原图整个就是一个强连通分量,建新图的时候就没有和新的起点相连的边
会输出零
我们从原起点到新起点的权值为这个强连通分量里点的个数的边就行了

没时间了下午再来写吧

下午打洛谷的比赛
Div2 感觉有点简单就没仔细看
直接 Div1
想了半天 T1
一开始觉得很简单,后来越写越不对劲
叫来 ztx 求助,他一直在弄什么 ×0.9 的乱搞做法
然后发现 提交 2k ,通过 4
溜了……(浪费了一下午)

上午的题也没写,溜了,下次再写
(晚上看学雷锋电影和王者说,乐

posted @ 2024-03-17 17:02  OrangeStar*  阅读(6)  评论(0编辑  收藏  举报