求助,wa点2点10/kk
查看原帖
求助,wa点2点10/kk
127873
1ink楼主2020/11/23 21:08
//#include <bits/stdc++.h>
#include <queue>
#include <iostream>
#include <iomanip>
#include <math.h>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <string>
#define F(i, a, b) for(register int i = a, i##end = b; i <= i##end; i++)
#define UF(i, a, b) for(register int i = a, i##end = b; i >= i##end; i--)
using namespace std;
inline int read() 
{
    int x = 0;
    bool fu = 0;
    char ch = 0;
    while(ch > '9' || ch < '0') 
    {
        ch = getchar();
        if(ch == '-')
            fu = 1;
    }
    while(ch <= '9' && ch >= '0') 
        x = (x * 10 - 48 + ch), ch = getchar();
    return fu ? -x : x;
}
struct Edge
{
    int to, next, val;
}edges[10005];
int epos;
int head[10005];
bool in[5005];
void add(int u, int v, int val)
{
    edges[++epos].to = v;
    edges[epos].next = head[u];
    edges[epos].val = val;
    head[u] = epos;
}
int n;
int nu, nv, nval, val, st;
int r;
int dfs(int u, int f, int d)
{
    if(d > val)
    {
        val = d;
        st = u;
    }
    int myr = -1;
    for(int i = head[u]; i; i = edges[i].next)
    {
        int v = edges[i].to;
        int toval = edges[i].val;
        if(v != f && (u != nu || v != nv) && (u != nv || v != nu))
        {
            myr = max(myr, dfs(v, u, d + toval) + toval);
        }
    }
    r = min(r, max(myr, d));
    return myr;
}
int mission()
{
    val = -1;
    r = 0x3f3f3f3f;
    dfs(nu, 0, 0);
    val = -1;
    r = 0x3f3f3f3f;
    dfs(st, 0, 0);
    int dis1 = val;
    int mid1 = r;
    val = -1;
    r = 0x3f3f3f3f;
    dfs(nv, 0, 0);
    val = -1;
    r = 0x3f3f3f3f;
    dfs(st, 0, 0);
    int dis2 = val;
    int mid2 = r;
    return max(max(dis1, dis2), mid1 + nval + mid2);
}
signed main()
{
    n = read();
    int ans = 0x3f3f3f3f;
    F(i, 1, n - 1)
    {
        int u = read(), v = read(), val = read();
        add(u, v, val);
        add(v, u, val);
    }
    F(i, 1, n)
    {
        for(int j = head[i]; j; j = edges[j].next)
        {
            nu = i, nv = edges[j].to, nval = edges[j].val;
            if(!in[nv])
                ans = min(ans, mission());
        }
        in[i] = true;
    }
    printf("%d", ans);
    return 0;
}
2020/11/23 21:08
加载中...