牛客OI赛制测试赛 D:小叶的巡查

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37960603/article/details/82217164

题目传送门
求树的直径即可
代码:

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

typedef long long LL;
typedef pair<LL,int> P;
const int maxn=30000+100;
const LL INF=1e18;

LL dis[maxn];
bool vis[maxn];
struct Edge{

    int to,next;
    LL len;
}edge[maxn<<1];
int head[maxn],tot;
int n,node;

void Dijkstra(int s){

    priority_queue<P,vector<P>,greater<P> >que;
    for(int i=1;i<=n;i++) dis[i]=INF,vis[i]=false;
    dis[s]=0;
    node=s;
    que.push(P(0,s));
    while(!que.empty()){

        P p=que.top();
        que.pop();
        int u=p.second;
        if(vis[u]) continue;
        vis[u]=true;
        for(int i=head[u];i!=-1;i=edge[i].next){

            Edge e=edge[i];
            int v=edge[i].to;
            if(!vis[v] && dis[v]>dis[u]+e.len){

                dis[v]=dis[u]+e.len;
                que.push(P(dis[v],v));
                if(dis[v]>dis[node]) node=v;
            }
        }
    }
}

int main(){

    scanf("%d",&n);
    tot=0;
    for(int i=1;i<=n;i++) head[i]=-1;
    for(int i=1;i<n;i++){

        int u,v;
        LL len;
        scanf("%d%d%lld",&u,&v,&len);
        edge[tot].to=v;
        edge[tot].len=len;
        edge[tot].next=head[u];
        head[u]=tot++;
        edge[tot].to=u;
        edge[tot].len=len;
        edge[tot].next=head[v];
        head[v]=tot++;
    }
    Dijkstra(1);
    Dijkstra(node);
    printf("%lld\n",dis[node]*10+(1+dis[node])*dis[node]/2);
}

猜你喜欢

转载自blog.csdn.net/qq_37960603/article/details/82217164