萌新刚学OI,改数小时未果
  • 板块学术版
  • 楼主Push_Y
  • 当前回复11
  • 已保存回复11
  • 发布时间2020/8/5 20:06
  • 上次更新2023/11/6 21:12:50
查看原帖
萌新刚学OI,改数小时未果
135485
Push_Y楼主2020/8/5 20:06

https://wzoi.cc/s/1565/3291

题目↑


我的60分code↓

#include <bits/stdc++.h>
#define int long long
using namespace std;

inline int gin(){
	char c=getchar();
	int s=0,f=1;
	while(c<'0'||c>'9'){
		if(c=='-')f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		s=(s<<3)+(s<<1)+(c^48);
		c=getchar();
	}
	return s*f;
}

const int N=5e5+5;
int n,m,d[N],head[N],f[N],tot=0,d1,d2;

struct edge{
	int dis,ne,to;
}e[N];
 
inline void add(int u,int v,int w){
	e[++tot].dis=w;
	e[tot].to=v;
	e[tot].ne=head[u];
	head[u]=tot;
}

inline void dfs(int u,int fa){
	if(!e[head[u]].ne)f[u]=d[u];
	for(int i=head[u];i;i=e[i].ne){
		int v=e[i].to;
		if(v==fa)continue;
		d[v]=d[u]+e[i].dis;
		dfs(v,u);
		f[u]=max(f[u],f[v]);
	}
}

signed main(){
	n=gin(),m=gin();
	for(int i=1;i<n;i++){
		int u=gin(),v=gin(),w=gin();
		add(u,v,w);
		add(v,u,w);
	}
	while(m--){
		int x=gin();
		memset(d,0,sizeof(d));
		memset(f,0,sizeof(f)); 
		dfs(x,-1);
		int d1=0,d2=0;
		for(int i=head[x];i;i=e[i].ne){
			int y=e[i].to;
			if(f[y]>d1){
				d2=d1;
				d1=f[y];
			}
			else d2=max(d2,f[y]);
		}
		printf("%lld\n",d1+d2);
	}
	return 0;
}

2020/8/5 20:06
加载中...