最大值和次大值

#include<bits/stdc++.h>
using namespace std;
#define ll long long
int const mod=1e9+7;
int const INF=0x3f3f3f3f;
int const N=1e5+7;
struct node{
	int a,next,len;
}e[N<<1];
int cnt,head[N];
void add(int x,int y,int len){
	e[++cnt].a=y;
	e[cnt].len=len;
	e[cnt].next=head[x];
	head[x]=cnt;
}
int n;
int chu[N];
bool vis[N];
struct L{
	ll p,w;
	friend bool operator<(L a,L b){
		return a.w>b.w;
	}
};
int w[N][3];
ll ans[N];
priority_queue<L>pq;
void merge(int p,int len){    //最大值和次大值
	if(len<w[p][1]) w[p][2]=w[p][1],w[p][1]=len;
	else if(len<w[p][2]) w[p][2]=len;
}
int main(){
	cin >> n;
	for(int i=1,a,b,c;i<=n-1;++i){
		cin >> a >> b >> c;
		add(a,b,c);add(b,a,c);
		chu[a]++;chu[b]++;
	}
	memset(w,0x3f,sizeof w);
	memset(ans,0x3f,sizeof ans);
	for(int i=1;i<=n;++i){
		if(chu[i]<2) {
			ans[i]=0;w[i][1]=w[i][2]=0;
			pq.push((L){i,0});
		}
	}
	while(!pq.empty()){
		int u=pq.top().p,z=pq.top().w;pq.pop();
		if(z>ans[u]) continue;
		for(int i=head[u];i;i=e[i].next){
			int v=e[i].a;
			merge(v,z+e[i].len);
			if(w[v][1]+w[v][2]<ans[v]) ans[v]=w[v][1]+w[v][2],pq.push((L){v,ans[v]});
		}
	}
	for(int i=1;i<=n;++i) if(ans[i]>1e9) ans[i]=-1;
	for(int i=1;i<=n;++i) cout << ans[i] << " ";
	return 0;
}


全部评论

相关推荐

好久没来牛客了,今天面试了一个实习生,感觉对方形象乱糟糟的,头发像鸡窝,像刚睡醒就来面试了,第一印象直接大打折扣,感觉我没有受到应有的尊重,再加上对方业务能力也一般,我直接挂掉;大家面试的时候还是好好收拾一下自己吧,争取给面试官留下个好印象,面试这东西还是存在眼缘的
MinJerous:更在乎本质,应该看候选人是否和岗位需要的能力匹配。洗脸/不洗头都无所谓吧,说不定人家刚刚通宵准备,就是为了这场面试呢?你挂掉他核心原因还是他能力不行,而不是形象。就算形象好点,能力不行你敢给过吗,不怕后面+1质疑你
点赞 评论 收藏
分享
04-03 12:09
東京大学 C++
求求求求暑期offer:留第一行,剩下的不要
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务