已知插排树的根节点在讲台上,有且仅有一个根节点(根节点入度为0),最远距离即所有插排的长度,小K电脑线的长度忽略不计
本题良心大样例下载地址: https://kench.co/tree.zip
题目描述:
第一行一个整数n表示有n个节点,然后n-1行,每行三个整数a,b,c,表示插排a是接在插排b上的,插排a的长度为c
输出:
一个整数n表示最远距离
样例:
9
2 1 2
3 1 2
4 1 1
5 2 3
6 2 1
7 3 1
8 3 4
9 7 5
输出:
8
说明1->3->7->9
对于30%的数据 n<233
对于70%的数据 n<2333
对于100%的数据 n<50000
a,b小于等于n
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <iostream>
#include <queue>
#include <vector>
#include <map>
#define LL long long
const int MAX=0x3f3f3f;
const int MAXN =1e6+7;
using namespace std;
struct node
{
int next,val;
node(int x,int y):next(x),val(y){}
};
int dis[MAXN];
vector<node>Ged[MAXN];
int vis[MAXN];
int num[50005]={0};
int n,m,k;
queue<int>Q;
void Spfa(int s,int e)
{
for(int i=0;i<=n;i++)
dis[i]=MAX;
for(int i=0;i<=n;i++)
vis[i]=0;
while(!Q.empty())Q.pop();
dis[s]=0;
Q.push(s);
vis[s]=1;
while(!Q.empty())
{
int cur=Q.front();
Q.pop();
vis[cur]=false;
for(int i=0;i<Ged[cur].size();i++)
{
// cout<<dis[i]<<endl;
// cout<<dis[cur]<<" "<<Map[cur][i]<<" "<<dis[i]<<endl;
int to=Ged[cur][i].next;
// cout<<dis[cur]<<" "<<Ged[cur][i].next<<" "<<Ged[cur][i].val<<endl;
if(!vis[to])
if(dis[cur]+Ged[cur][i].val<dis[to])
{
// cout<<dis[cur]+Map[cur][i]<<" "<<dis[i]<<endl;
dis[to]=dis[cur]+Ged[cur][i].val;
// if(!vis[to])
vis[to]=1,Q.push(to);
}
}
}
}
int main()
{
ios::sync_with_stdio(false);
std::cin.tie(0);
int fr,to,val;
//int num[500]={0};
cin>>n;
/*for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
Map[i][j]=MAX;
}*/
for(int i=0;i<n-1;i++)
{
cin>>fr>>to>>val;
// nex.next=to;
// nex.val=val;
node nex(to,val);
Ged[fr].push_back(nex);
Ged[to].push_back(node(fr,val));
num[fr]++;
//if(Map[fr][to]==MAX)
// Map[fr][to]=Map[to][fr]=val;
//else Map[fr][to]=Map[to][fr]=max(Map[fr][to],val);
}
int s;
for(int i=1;i<=n;i++)
{
if(num[i]==0)
{
s=i;
break;
}
}
Spfa(s,n);
int ans;
for(int i=1;i<=n;i++)
{
// cout<<dis[i]<<endl;
if(i==1)
ans=dis[i];
else ans=max(dis[i],ans);
}
cout<<ans<<endl;
return 0;
}