이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#include "dreaming.h"
#define startt ios_base::sync_with_stdio(false);cin.tie(0);
typedef long long ll;
using namespace std;
#define vint vector<int>
#define all(v) v.begin(), v.end()
#define MOD 1000000007
#define MOD2 998244353
#define MX 1000000000
#define MXL 1000000000000000000
#define PI (ld)2*acos(0.0)
#define nax 200005
#define pb push_back
#define sc second
#define fr first
//#define int unsigned long long
//#define endl '\n'
#define ld long double
#define NO cout << "NO" << endl
#define YES cout << "YES" << endl
vector<vector<pair<int, int>>> adj;
int bfs(int s)
{
queue<pair<pair<int, int>, int>> q;
q.push({{s, -1}, 0});
int now = 0;
while(!q.empty())
{
int node = q.front().fr.fr;
int dist = q.front().sc;
int parent = q.front().fr.sc;
if(adj[node].size() == 1)
{
now = max(now, dist);
}
q.pop();
for(auto v : adj[node])
{
if(v.fr != parent)
{
q.push({{v.fr, node}, dist+v.sc});
}
}
}
return now;
}
vector<bool> vis;
int dfs(int u)
{
int ans = bfs(u);
vis[u] = true;
for(auto v : adj[u])
{
if(!vis[v.fr])
{
ans = min(ans, dfs(v.fr));
}
}
return ans;
}
pair<int, int> dfsnow(int u, int p)
{
int mxnod = u, mxdist = 0;
for(auto v : adj[u])
{
if(v.fr != p)
{
pair<int, int> now = dfsnow(v.fr, u);
if(now.sc+v.sc > mxdist)
{
mxdist = max(mxdist, now.sc+v.sc);
mxnod = now.fr;
}
}
}
return {mxnod, mxdist};
}
int diametru(int u)
{
return dfsnow(dfsnow(u, -1).fr, -1).sc;
}
int travelTime(int n, int m, int l, int a[], int b[], int t[])
{
adj.clear();
for(int i = 0; i < n; i++)
{
vector<pair<int, int>> cop;
adj.pb(cop);
}
vis.assign(n+1, false);
for(int i = 0; i < m; i++)
{
adj[a[i]].pb({b[i], t[i]});
adj[b[i]].pb({a[i], t[i]});
}
int ans = 0;
int mxalready = 0;
vint mx;
for(int i = 0; i < n; i++)
{
if(!vis[i])
{
mx.pb(dfs(i));
mxalready = max(mxalready, diametru(i));
}
}
sort(all(mx));
ans+=mx[mx.size()-1];
ans+=mx[mx.size()-2];
ans+=l;
return max(ans, mxalready);
}
/*
int main()
{
int n, m, l;
cin >> n >> m >> l;
int a[m], b[m], t[m];
for(int i = 0; i < m; i++)
{
cin >> a[i] >> b[i] >> t[i];
}
cout << travelTime(n, m, l, a, b, t) << endl;
}
*/
/*
7
5
2
0 1 10
0 5 5
5 4 6
3 2 2
2 6 1
8 6 3
0 1 1
1 2 1
1 3 1
1 4 10
4 5 10
6 7 7
2 0 2
3 1 10
1 2 1
9 7 2
0 1 4
1 2 2
2 3 4
4 5 1
5 6 5
5 7 7
7 8 3
*/
# | 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... |