社区讨论
求调!!!
P3304[SDOI2013] 直径参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @lxj3qqfe
- 此快照首次捕获于
- 2024/06/17 23:00 2 年前
- 此快照最后确认于
- 2024/06/18 15:40 2 年前
第问炸了全输出(第问已过不必看)
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 条回复,欢迎继续交流。
正在加载回复...