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;
}
相关推荐
Controller-Inversion17 分钟前
322. 零钱兑换
算法
头发够用的程序员18 分钟前
C++和Python面试经典算法汇总(一)
开发语言·c++·python·算法·容器·面试
淡海水38 分钟前
【AI模型】模型量化技术详解
人工智能·算法·机器学习
炸膛坦客41 分钟前
嵌入式 - 数据结构与算法:(1-1)数据结构 - 顺序表(Sequential List)
数据结构·算法·嵌入式
水龙吟啸1 小时前
数据结构与算法随机复习–Day1
数据结构·c++·算法
生成论实验室1 小时前
《事件关系阴阳博弈动力学:识势应势之道》第八篇:认知与反思关系——探索、定位与延续
人工智能·算法·架构·知识图谱·创业创新
十五年专注C++开发1 小时前
浅谈LLVM
开发语言·c++·qt·clang·llvm
YaraMemo1 小时前
一文带你区分全局最优解和帕累托最优解
算法·5g·信息与通信·信号处理
白夜11172 小时前
C++(标签派发 Tag Dispatching)
开发语言·c++·笔记·算法
王老师青少年编程2 小时前
csp信奥赛C++高频考点专项训练之字符串 --【字符串基础】:凯撒密码
c++·字符串·csp·凯撒密码·高频考点·信奥赛·一等奖