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;
}
相关推荐
纪念 229几秒前
C++算法(一)
开发语言·c++·算法
All for pursuit.20 分钟前
【二叉树-10】114.二叉树展开为链表
数据结构·c++·算法·leetcode·链表
叠层归一研究院22 分钟前
区分预算与通道诱导:Ω–L叠层体系的观测赋值与定量验证
人工智能·算法
多弗朗皮卡丘25 分钟前
C++string类
c++
BYSJMG44 分钟前
计算机毕业设计选题推荐:基于大数据的快递物流运营数据分析与可视化,Spark与K-Means
大数据·算法·数据分析·spark·课程设计
阳明山水1 小时前
因果一致性正则化实战解析
人工智能·深度学习·算法·机器学习·架构
Yunovian2 小时前
AI时代,针对模型与应用,浅谈一下各编程语言
开发语言·c++·人工智能·python·ai·rust·ai编程
黄金龙PLUS2 小时前
5个1024比特大状态置换算法的设计与分析
算法·网络安全·密码学·哈希算法·同态加密
心中有你02143 小时前
C语言埃氏筛法(素数筛选)
c语言·数据结构·算法
Omics Pro4 小时前
Cell封面|衰老生物学开源AI工具包
数据库·人工智能·算法·机器学习·自然语言处理