入门萌新求教CF911F WA ON 20#
查看原帖
入门萌新求教CF911F WA ON 20#
826079
Autumn_Rain楼主2024/9/17 12:36

一段时间之前写的代码,想知道是什么地方出错了,还恳请大家帮忙。

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int n,u,v;
vector<int>G[N];
int A,B,far;
int d[N],f[N];
bool vis[N];
//diameter
void dfs(int u,int fa){
	f[u]=fa;
	if(d[u]>d[far])far=u;
	for(int i=0;i<G[u].size();i++){
		int v=G[u][i];
		if(v==fa)continue;
		d[v]=d[u]+1;
		dfs(v,u);
	}
}
//diameter
//LCA
int d2[N],anc[N][30];
void init(){
	for(int j=1;j<=20;j++){
		for(int i=1;i<=n;i++){
			anc[i][j]=anc[anc[i][j-1]][j-1];
		}
	}
}
void dfs2(int u,int fa){
	for(int i=0;i<G[u].size();i++){
		int v=G[u][i];
		if(v==fa)continue;
		d2[v]=d2[u]+1;
		anc[v][0]=u;
		dfs2(v,u);
	}
}
int lca(int u,int v){
	if(d2[u]<d2[v])swap(u,v);
	for(int i=20;i>=0;i--){
		if(d2[anc[u][i]]>=d2[v]){
			u=anc[u][i];
		}
	}
	if(u==v)return u;
	for(int i=20;i>=0;i--){
		if(anc[u][i]!=anc[v][i]){
			u=anc[u][i];
			v=anc[v][i];
		}
	}
	return anc[u][0];
}
//LCA
int deg[N];
struct node{
	int a,b;
}ans[N];
int tot;
int main(){
	cin>>n;
	for(int i=1;i<n;i++){
		cin>>u>>v;
		G[u].push_back(v);
		G[v].push_back(u);
		deg[u]++;deg[v]++;
	}
	dfs(1,0);A=far;
	memset(f,0,sizeof(f));
	dfs(A,0);B=far;
	int cal=0;
	for(int i=B;i;i=f[i]){
		vis[i]=1;//point on diameter
		cal++;
	}
	cal--;
	int res=(1+cal)*cal/2;
	d2[1]=1;
	dfs2(1,0);
	init();	
//	cout<<lca(4,5);
	int dA=d2[A],dB=d2[B];
//	cout<<A<<' '<<B<<"\n"<<dA<<' '<<dB;
	for(int i=1;i<=n;i++){
		if(deg[i]!=1)continue;
		if(vis[i])continue;
		int fa1=lca(i,A);
		int fa2=lca(i,B);
//		cout<<fa1<<" "<<fa2<<"\n";
//		cout<<d[i]<<" "<<dA<<" "<<dB<<"\n";
		int w1=d2[i]+dA-2*d2[fa1];
		int w2=d2[i]+dB-2*d2[fa2];
		if(w1>w2){res+=w1;ans[++tot].a=A;}
		else{res+=w2;ans[++tot].a=B;}
		ans[tot].b=i;
		deg[i]=0;
	}
	cout<<res<<"\n";
	for(int i=1;i<=tot;i++){
		cout<<ans[i].a<<" "<<ans[i].b<<" "<<ans[i].b<<"\n";
	}
	for(int i=B;i;i=f[i]){
		if(i==A)break;
		cout<<A<<" "<<i<<" "<<i<<"\n";
	}
	return 0;
}

玄关+生祝,如果可以帮我调好的话,可以留下您的生日,然后我会在您生日那天来帖子底下@您并祝您生日快乐

2024/9/17 12:36
加载中...