Submission #336140

#TimeUsernameProblemLanguageResultExecution timeMemory
336140aryan12Dreaming (IOI13_dreaming)C++17
100 / 100
272 ms19308 KiB
#include <bits/stdc++.h>
#include "dreaming.h"
using namespace std;

const int N = 1e5 + 10;
vector<pair<int, int> > g[N];
bool vis[N];
int dist[N][2];
int idx, maxdist;
pair<int, int> diameter;
set<int> comp;

void Initialize() {
    diameter.first = 0;
    diameter.second = 0;
    for(int i = 0; i < N; i++) {
        g[i].clear();
        vis[i] = false;
        dist[i][0] = 0;
        dist[i][1] = 0;
    }
}

void dfs(int node, int par, int wt, int state) {
    vis[node] = true;
    comp.insert(node);
    if(maxdist < wt) {
        maxdist = wt;
        idx = node;
    }
    dist[node][state] = wt;
    for(int i = 0; i < g[node].size(); i++) {
        if(g[node][i].first == par)
            continue;
        dfs(g[node][i].first, node, wt + g[node][i].second, state);
    }
}

int travelTime(int n, int m, int l, int v[], int u[], int w[]) {
    Initialize();
    for(int i = 0; i < m; i++) {
        g[u[i]].push_back({v[i], w[i]});
        g[v[i]].push_back({u[i], w[i]});
    }
    int ans = 0;
    vector<int> temp;
    for(int i = 0; i < n; i++) {
        if(!vis[i]) {
            idx = 0;
            maxdist = -1;
            dfs(i, -1, 0, 0);
            diameter.first = idx;
            maxdist = -1;
            dfs(idx, -1, 0, 0);
            diameter.second = idx;
            ans = max(ans, maxdist);
            //cout << "i = " << i << ", diameter nodes = " << diameter.first << ", " << diameter.second << ", maxdist = " << maxdist << endl;
            int best = maxdist;
            maxdist = -1;
            dfs(idx, -1, 0, 1);
            for(auto i: comp) {
                best = min(best, max(dist[i][0], dist[i][1]));
            }
            comp.clear();
            temp.push_back(best);
        }
    }
    sort(temp.begin(), temp.end());
    reverse(temp.begin(), temp.end());
    if(n - m >= 2) {
        ans = max(ans, temp[0] + temp[1] + l);
    }
    if(n - m >= 3) {
        ans = max(ans, temp[1] + temp[2] + 2 * l);
    }
    return ans;
}

/*int main() {
    int n, m, l;
    cin >> n >> m >> l;
    int a[m], b[m], c[m];
    for(int i = 0; i < m; i++) {
        cin >> a[i] >> b[i] >> c[i];
    }
    cout << travelTime(n, m, l, a, b, c) << endl;
}*/

Compilation message (stderr)

dreaming.cpp: In function 'void dfs(int, int, int, int)':
dreaming.cpp:32:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   32 |     for(int i = 0; i < g[node].size(); i++) {
      |                    ~~^~~~~~~~~~~~~~~~
#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...