#include "dreaming.h"
#include <bits/stdc++.h>
using namespace std;
vector<vector<pair<int, int>>> adj;
vector<bool> vis, dvis;
vector<int> diapath, diaedges;
int diameter(int node, int N){
diapath.clear(), diaedges.clear();
int a = 0, b = 0, dist = 0, p;
dvis = vis;
queue<pair<int, int>> q;
vector<int> parent(N);
q.push({node, 0});
while(!q.empty()){
pair<int, int> val = q.front();
q.pop();
if(dvis[val.first]) continue;
for(pair<int, int> i : adj[val.first]){
if(!dvis[i.first]){
q.push({i.first, i.second + val.second});
if(i.second + val.second > dist){
a = i.first;
dist = i.second + val.second;
}
}
}
dvis[val.first] = true;
}
q.push({a, 0});
dvis = vis, dist = 0;
while(!q.empty()){
pair<int, int> val = q.front();
q.pop();
if(dvis[val.first]) continue;
for(pair<int, int> i : adj[val.first]){
if(!dvis[i.first]){
parent[i.first] = val.first;
q.push({i.first, i.second + val.second});
if(i.second + val.second > dist){
b = i.first;
dist = i.second + val.second;
}
}
}
dvis[val.first] = true;
}
p = b;
while(p != a){
diapath.push_back(p);
for(pair<int, int> i : adj[p]) if(i.first == parent[p]) diaedges.push_back(i.second);
p = parent[p];
}
diapath.push_back(a);
vis = dvis;
return dist;
}
int travelTime(int N, int M, int L, int A[], int B[], int T[]) {
adj.resize(N);
int ret = 0, bigcenter = 0, maxdia = 0;
vector<int> centers;
for(int i = 0; i < M; i++){
adj[A[i]].push_back({B[i], T[i]});
adj[B[i]].push_back({A[i], T[i]});
}
vis.assign(N, false);
for(int i = 0; i < N; i++){
if(!vis[i]){
int dialength = diameter(i, N);
vis[i] = true;
int c = i, c1 = i, c2 = i, fw = 0, bw = 0;
if(dialength > 0){
vector<int> pref = {0}, suff;
int p = 0, s = 0, mindist;
for(int i = 0; i < diaedges.size(); i++){
fw += diaedges[i];
bw += diaedges[diaedges.size() - i - 1];
p += fw;
s += bw;
pref.push_back(p);
suff.push_back(s);
}
suff.push_back(0);
mindist = p;
for(int i = 1; i < diapath.size(); i++){
if(abs(pref[i] - suff[suff.size() - i - 1]) < mindist){
mindist = abs(pref[i] - suff[suff.size() - i - 1]);
c = diapath[i];
}
}
}
if(dialength > maxdia){
bigcenter = c;
maxdia = dialength;
}
centers.push_back(c);
}
}
for(int i : centers){
if(i != bigcenter){
adj[i].push_back({bigcenter, L});
adj[bigcenter].push_back({i, L});
}
}
vis.assign(N, false);
return diameter(0, N);
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |