45162023-03-29 12:08:33AGergoLogisztikai központcpp17Futási hiba 20/5059ms128996 KiB
#include <bits/stdc++.h>

using namespace std;

//csak 1 út minden vársoba!
//jó város mindig a leghosszabb úton

vector<vector<long int>> tav;
vector<vector<int>> gyerek;
vector<vector<int>> eljut;
int maxlen = 0, maxid;

void leghossz(int start,int cur,long int dis)
    {
        for(int x : gyerek[cur])
        {
            if(tav[start][x] == -1)
            {
                tav[start][x] = dis + tav[cur][x];
                leghossz(start,x,dis + tav[cur][x]);
            }
        }
    }

    void leghosszut(int start,int cur,long int dis, vector<int> jut)
    {
        for(int x : gyerek[cur])
        {
            if(tav[start][x] == -1)
            {
                tav[start][x] = dis + tav[cur][x];

                eljut[x] = jut;
                eljut[x].push_back(cur);

                leghosszut(start,x,dis + tav[cur][x],eljut[x]);
            }
        }
    }



int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);

    int varosszam;
    cin >> varosszam;

    int a,b;

    tav.resize(varosszam+1,vector<long int>(varosszam+1,-1));
    gyerek.resize(varosszam+1);
    eljut.resize(varosszam+1);

    for(int i = 1; i < varosszam;i++)
    {
        tav[i][i] = 0;

        cin >> a >> b;

        cin >> tav[a][b];
        tav[b][a] = tav[a][b];

        gyerek[a].push_back(b);
        gyerek[b].push_back(a);
    }

    for(int x : gyerek[1])
    {
        leghossz(1,x,tav[1][x]);
    }

    for(int i = 1; i < varosszam+1;i++)
    {
        if(tav[1][i] > maxlen)
        {
            maxlen = tav[1][i];
            maxid = i;
        }
    }

    int v = maxid;

    for(int x : gyerek[v])
    {
        leghosszut(v,x,tav[v][x],{});
    }

    for(int i = 1; i < varosszam+1;i++)
    {
        if(tav[v][i] > maxlen)
        {
            maxlen = tav[v][i];
            maxid = i;
        }
    }

    long int shortest;
    set<int> longests;

    if(tav[v][eljut[maxid][0]] >= maxlen - tav[v][eljut[maxid][0]])
    {
        shortest = tav[v][eljut[maxid][0]];
        longests.insert(eljut[maxid][0]);
    }
    else
    {
        shortest = maxlen - tav[v][eljut[maxid][0]];
        longests.insert(eljut[maxid][0]);
    }

    for(int x : eljut[maxid])
    {
        //cout << x << " ";
        if(tav[v][x] >= maxlen - tav[v][x] && tav[v][x] <= shortest)
        {
            if(tav[v][x] < shortest)
            {
                longests.clear();
            }
            shortest = tav[v][x];
            longests.insert(x);
        }
        else if(tav[v][x] < maxlen - tav[v][x] && maxlen - tav[v][x] <= shortest)
        {
            if(maxlen - tav[v][x] < shortest)
            {
                longests.clear();
            }
            shortest = maxlen - tav[v][x];
            longests.insert(x);
        }
    }

    //cout << '\n';

    cout << shortest << "\n" << longests.size() << "\n";
    for(int x : longests)
    {
        cout << x << " ";
    }
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
base20/50
1Elfogadva0/03ms1768 KiB
2Futási hiba0/059ms128996 KiB
3Elfogadva4/43ms2284 KiB
4Részben helyes2/43ms2504 KiB
5Elfogadva4/42ms2596 KiB
6Részben helyes2/43ms2728 KiB
7Részben helyes2/43ms3532 KiB
8Elfogadva5/58ms20652 KiB
9Futási hiba0/259ms127760 KiB
10Futási hiba0/259ms127756 KiB
11Részben helyes1/24ms7388 KiB
12Futási hiba0/218ms38944 KiB
13Futási hiba0/259ms127464 KiB
14Futási hiba0/259ms127432 KiB
15Futási hiba0/257ms127196 KiB
16Futási hiba0/257ms127172 KiB
17Futási hiba0/248ms126968 KiB
18Futási hiba0/257ms126944 KiB
19Futási hiba0/257ms126936 KiB
20Futási hiba0/357ms126920 KiB