P4630 [APIO2018] 铁人两项(圆方树模版)

*原题链接*

圆方树相关的东西小粉兔讲的太详细了!!(洛谷日报

在此贴出适合我体质的模版,至于讲解,咱肯定讲的没小粉兔好o(╥﹏╥)o。

圆方树模版:

cpp 复制代码
void tarjan(int x){
	dfn[x]=low[x]=++tim,stk[++top]=x;
	for(int i=head[x];i;i=edge[i].nxt){
		int y=edge[i].to;
		if(!dfn[y]){
			tarjan(y);
			low[x]=min(low[x],low[y]);
			if(low[y]==dfn[x]){
				cnt++;int t;
				do{
					t=stk[top--],add(t,cnt),add(cnt,t);
				}while(t!=y);//注意截止条件
				add(x,cnt),add(cnt,x);//别忘了和x连边
			}
		}
		else low[x]=min(low[x],dfn[y]);
	}
}

整题代码:

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e5+10;

int read(){
	int x=0,f=1;char ch=getchar();
	while(!isdigit(ch)){
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(isdigit(ch)) x=x*10+ch-'0',ch=getchar();
	return x*f;
}

int n,m,head[N],tot,he[N],tot2,w[N],sz[N],ans,num,vis[N];
int dfn[N],low[N],tim,stk[N],top,cnt;
struct node{
	int to,nxt;
}e[N*2],edge[N*2];
void add(int x,int y){
	edge[++tot].to=y;
	edge[tot].nxt=head[x];
	head[x]=tot;
}
void ADD(int x,int y){
	e[++tot2].to=y;
	e[tot2].nxt=he[x];
	he[x]=tot2;
}

void tarjan(int x){
	dfn[x]=low[x]=++tim,stk[++top]=x,num++;
	for(int i=he[x];i;i=e[i].nxt){
		int y=e[i].to;
		if(!dfn[y]){
			tarjan(y);
			low[x]=min(low[x],low[y]);
			if(low[y]==dfn[x]){
				cnt++;int t;
				do{
					w[cnt]++,t=stk[top--],add(t,cnt),add(cnt,t);
				}while(t!=y);
				add(x,cnt),add(cnt,x),w[cnt]++;
			}
		}
		else low[x]=min(low[x],dfn[y]);
	}
}

void dfs(int x){
	vis[x]=1;sz[x]=(x<=n);
	for(int i=head[x];i;i=edge[i].nxt){
		int y=edge[i].to;
		if(vis[y]) continue;
		dfs(y);
		ans+=2*sz[x]*sz[y]*w[x];
		sz[x]+=sz[y];
	}
	ans+=2*sz[x]*(num-sz[x])*w[x];
}

signed main(){
	
	n=read(),m=read();cnt=n;for(int i=1;i<=n;i++) w[i]=-1;
	for(int i=1;i<=m;i++){int x=read(),y=read();ADD(x,y),ADD(y,x);}
	for(int i=1;i<=n;i++){
		if(!dfn[i]){memset(vis,0,sizeof(vis)),num=0,tarjan(i),dfs(i);}
	}
	cout<<ans<<endl;
	
	return 0;
}
相关推荐
郝学胜-神的一滴33 分钟前
Qt 入门 01-01:从零基础到商业级客户端实战
开发语言·c++·qt·程序人生·软件构建
宏笋42 分钟前
C++ thread的detach()方法详解
c++
旖-旎1 小时前
深搜练习(单词搜索)(12)
c++·算法·深度优先·力扣
企客宝CRM2 小时前
2026年中小企业CRM选型指南:企客宝CRM处于什么位置?
android·算法·企业微信·rxjava·crm
橙淮2 小时前
二叉树核心概念与Java实现详解
数据结构·算法
大卡片2 小时前
C++的基础知识点
开发语言·c++
米罗篮2 小时前
DSU并查集 & 拓展欧几里得-逆元
c++·经验分享·笔记·算法·青少年编程
橙淮2 小时前
双指针法:高效算法解题的利器
算法
初心未改HD2 小时前
深度学习之MLP与反向传播算法详解
人工智能·深度学习·算法