#include<iostream>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<cstring>
#include<cmath>//头文件
using namespace std;
const int N=1e6+5;
long long n,k,x,y,z,v[2*N],ne[2*N],tot=-1,head[N],level[N],w[2*N],aa[N],bb[N];
bool vis[N];
void add(long long x,long long y,long long z){
v[++tot]=y;
w[tot]=z;
ne[tot]=head[x];
head[x]=tot;//链式前向星
}
long long bfs(long long x,long long dis[]){//广搜
memset(vis,0,sizeof vis);
memset(dis,0,sizeof dis);//先归零
queue<long long> q;//创建队列q
vis[x]=1,dis[x]=0;//标记起点
q.push(x);//起点入队
while(!q.empty()){
long long t=q.front();//取出队首
q.pop();//出队
for(long long i=head[t];~i;i=ne[i]){//遍历邻接点
long long xx=v[i];//取出当前点
if(!vis[xx]){//若未标记
q.push(xx);//入队
vis[xx]=1;//标记
dis[xx]=dis[t]+w[i]; //记录长度
}
}
}
long long node=1;//找一个节点
for(int i=2;i<=n;i++) if(dis[i]>dis[node]) node=i;//若比当前最大值大,则换点
return node;//返回点
}
int main(){
memset(head,-1,sizeof head);//初始化head数组
cin>>n>>k;
for(int i=1;i<=k;i++){
cin>>x>>y>>z;
add(x,y,z);
add(y,x,z);//链式前向星*2
}
long long a=bfs(1,level),maxx=0;//找直径的一个端点
long long b=bfs(a,level);//找另一个端点
long long t=bfs(a,aa);//找到AB
t=bfs(b,bb);//找到AC
for(int i=1;i<=n;i++) maxx=max(maxx,min(aa[i],bb[i]));//寻找最坏可能性
cout<<level[b]+maxx;//输出
return 0;
}
逃学的小孩 代码+注释
于 2024-12-15 20:47:01 首次发布