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;
}
相关推荐
c++之路1 小时前
适配器模式(Adapter Pattern)
java·算法·适配器模式
吴声子夜歌1 小时前
Java——接口的细节
java·开发语言·算法
myheartgo-on1 小时前
Java—方 法
java·开发语言·算法·青少年编程
汉克老师3 小时前
GESP6级C++考试语法知识(四、图与树(四))
c++·贪心算法·优先队列·哈夫曼编码·哈夫曼树·gesp6级·gesp六级
宝贝儿好3 小时前
【LLM】第三章:项目实操案例:智能输入法项目
人工智能·python·深度学习·算法·机器人
子兮曰3 小时前
whisper.cpp 深度解析:从边缘设备到实时语音识别
前端·c++·后端
雪碧聊技术3 小时前
上午题_算法
算法·软考·软件设计师
特种加菲猫4 小时前
二叉搜索树:数据世界的“快速寻路指南”
开发语言·c++
naturerun4 小时前
从数组中删除元素的算法
数据结构·c++·算法