社区讨论

求调!!!

P3304[SDOI2013] 直径参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lxj3qqfe
此快照首次捕获于
2024/06/17 23:00
2 年前
此快照最后确认于
2024/06/18 15:40
2 年前
查看原帖
22问炸了全输出00(第11问已过不必看)
Code:
CPP
#include<bits/stdc++.h>
#define il inline
#define rg register
#define ll long long
#define int long long
using namespace std;

const int N=2e5+1;

struct lorbl{
	int to,nxt,w;
	bool ban;
}edge[2*N];

int n,cnt,he[N],d[N],dist[N],in[3],c,j,k,l[N],r[N];

deque<int>num,nume;

il void add(rg int u,rg int v,rg int w){
	edge[++cnt]={v,he[u],w,0};
	he[u]=cnt;
}

il void dfs(rg int u,rg int fa,rg bool sta,rg bool sta2){
	for(rg int i=he[u];i;i=edge[i].nxt){
		rg int v=edge[i].to;
		if(v==fa)
			continue;
		if(sta2&&edge[i].ban)
			continue;
		d[v]=d[u]+edge[i].w;
		if(d[v]>d[c]){
			c=v;
			if(sta)
				num.push_back(v),nume.push_back(i);
		}
		dfs(v,u,sta,sta2);
	}
}

il void dfs_l(rg int u,rg int fa){
	c=u;
	for(rg int i=he[u];i;i=edge[i].nxt){
		rg int v=edge[i].to;
		if(v==fa)
			continue;
		l[v]=l[u]+edge[i].w;
		if(l[v]>l[c]){
			c=v;
		}
		dfs_l(v,u);
	}
}

il void dfs_r(rg int u,rg int fa){
	c=u;
	for(rg int i=he[u];i;i=edge[i].nxt){
		rg int v=edge[i].to;
		if(v==fa)
			continue;
		r[v]=r[u]+edge[i].w;
		if(r[v]>r[c]){
			c=v;
		}
		dfs_r(v,u);
	}
}

il void dfse(rg int u,rg int fa){
	for(rg int i=he[u];i;i=edge[i].nxt){
		rg int v=edge[i].to;
		if(v==fa)
			continue;
		d[v]=d[u]+1;
		dfse(v,u);
	}
}

signed main(){
	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	cin>>n;
	for(rg int i=1;i<n;++i){
		cin>>in[0]>>in[1]>>in[2];
		add(in[0],in[1],in[2]);
		add(in[1],in[0],in[2]);
	}
	dfs(1,0,0,0);
	d[c]=0;
	num.push_back(c);
	dfs(c,0,1,0);
	num.push_back(c);
	cout<<d[c]<<endl;
	dfs_l(num[0],0);
	dfs_r(num[num.size()-1],0);
	for(rg int i=0;i<nume.size();++i){
		edge[nume[i]].ban=1;
	}
	//j_l&&k_r
	//first calc j
	//next  calc k
	for(rg int i=0;i<num.size();++i){
		dfs(i,0,0,1);
		if(d[c]==r[i]){
			k=i;
			break;
		}
	}
	for(rg int i=j;i>0;--i){
		dfs(i,0,0,1);
		if(d[c]==l[i]){
			j=i;
			break;
		}
	}
	dfse(j,0);
	cout<<d[k]<<endl;
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...