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;
}
相关推荐
做运维的阿瑞17 分钟前
多表查询基础:INNER JOIN、LEFT JOIN、RIGHT JOIN
数据库·sql·mysql·算法
无名猿18 分钟前
拷贝构造与拷贝赋值:调用时机、深浅拷贝与复制消除
c++·内存管理·现代c++·踩坑记录
大侠归来1 小时前
C语言素数判断:从入门到进阶
java·c语言·算法
v:PLLucky201 小时前
农作物病虫害检测识别系统
深度学习·scrapy·算法·百度·微信公众平台
朝朝辞暮i1 小时前
C++ 第一阶段总结:从零基础到 ROS2 前置语法
开发语言·c++·算法
朝朝辞暮i1 小时前
C++ 第 25 课:getter / setter + this
java·javascript·c++
H.莓飛1 小时前
【数据结构】链表_OJ题
linux·数据结构·算法·链表
All for pursuit.2 小时前
【回溯-4】46.全排列
数据结构·c++·算法·leetcode
小鱼~~2 小时前
Recall@K、Precision@K、MRR、nDCG@K简介
人工智能·算法·机器学习
在所不辞兄2 小时前
【零基础学智能仿真-38】从规则矩形到带孔薄板:Gmsh 网格与 FEniCSx 联合求解
人工智能·深度学习·算法·机器学习·工程仿真