Submission #1251037

#TimeUsernameProblemLanguageResultExecution timeMemory
1251037cpismylifeOwODreaming (IOI13_dreaming)C++20
100 / 100
172 ms39124 KiB
#include <bits/stdc++.h>
#ifndef cpismylifeOwO
#include "dreaming.h"
#endif // cpismylifeOwO

using namespace std;

const long long mod = 1e9 + 7;
const int MaxN = 1e6 + 5;

int ni, mi, li;
int Ai[MaxN];
int Bi[MaxN];
int Ti[MaxN];

#ifdef cpismylifeOwO
void Inp()
{
    cin >> ni >> mi >> li;
    for (int x = 0; x < mi; x++)
    {
        cin >> Ai[x] >> Bi[x] >> Ti[x];
    }
}
#endif // cpismylifeOwO

struct Edge
{
    int u, v, w;
};

int n, m, l;
Edge edges[MaxN];
vector<int> graph[MaxN];
int best[MaxN];
int secbest[MaxN];
int bestpos[MaxN];
int F[MaxN];
bool visited[MaxN];
vector<int> cur;

void DFS(int u, int p)
{
    visited[u] = true;
    cur.push_back(u);
    best[u] = 0;
    secbest[u] = -1e9;
    bestpos[u] = 0;
    for (int x : graph[u])
    {
        int v = edges[x].u ^ edges[x].v ^ u, w = edges[x].w;
        if (v != p)
        {
            DFS(v, u);
            if (best[u] < best[v] + w)
            {
                secbest[u] = best[u];
                best[u] = best[v] + w;
                bestpos[u] = v;
            }
            else if (secbest[u] < best[v] + w)
            {
                secbest[u] = best[v] + w;
            }
        }
    }
}

void Reroot(int u, int p, int pre)
{
    F[u] = max(best[u], pre);
    for (int x : graph[u])
    {
        int v = edges[x].u ^ edges[x].v ^ u, w = edges[x].w;
        if (v != p)
        {
            if (bestpos[u] == v)
            {
                Reroot(v, u, max(pre, secbest[u]) + w);
            }
            else
            {
                Reroot(v, u, max(pre, best[u]) + w);
            }
        }
    }
}

priority_queue<pair<int, int>> pq;

int travelTime(int N, int M, int L, int A[], int B[], int T[])
{
    n = N;
    m = M;
    l = L;
    for (int x = 1; x <= m; x++)
    {
        edges[x].u = A[x - 1] + 1;
        edges[x].v = B[x - 1] + 1;
        edges[x].w = T[x - 1];
        graph[edges[x].u].push_back(x);
        graph[edges[x].v].push_back(x);
    }
    for (int x = 1; x <= n; x++)
    {
        if (!visited[x])
        {
            cur.clear();
            DFS(x, -1);
            Reroot(x, -1, 0);
            pair<int, int> mi = make_pair(F[cur[0]], cur[0]);
            for (int x : cur)
            {
                mi = min(mi, make_pair(F[x], x));
            }
            pq.push(mi);
        }
    }
    pair<int, int> cur = pq.top();
    pq.pop();
    while (!pq.empty())
    {
        pair<int, int> now = pq.top();
        pq.pop();
        m++;
        edges[m].u = cur.second;
        edges[m].v = now.second;
        //cout << edges[m].u << " " << edges[m].v << "\n";
        edges[m].w = l;
        graph[edges[m].u].push_back(m);
        graph[edges[m].v].push_back(m);
    }
    DFS(1, -1);
    Reroot(1, -1, 0);
    int res = 0;
    for (int x = 1; x <= n; x++)
    {
        res = max(res, F[x]);
    }
    return res;
}

#ifdef cpismylifeOwO
void Exc()
{
    cout << travelTime(ni, mi, li, Ai, Bi, Ti);
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    int test = 1;
    //cin >> test;
    for (int x = 1; x <= test; x++)
    {
        Inp();
        Exc();
    }
    return 0;
}
#endif // cpismylifeOwO
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...