結果
| 問題 |
No.1833 Subway Planning
|
| コンテスト | |
| ユーザー |
ぷら
|
| 提出日時 | 2022-02-04 22:13:04 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 848 ms / 4,000 ms |
| コード長 | 1,667 bytes |
| コンパイル時間 | 2,188 ms |
| コンパイル使用メモリ | 197,792 KB |
| 最終ジャッジ日時 | 2025-01-27 19:12:10 |
|
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 23 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
int dfs(int n,int p,int &res,int &f,vector<int>&used,vector<vector<int>>&ki) {
int sum = 0,cnt = 0;
for(int i:ki[n]) {
if(i == p) {
continue;
}
int x = dfs(i,n,res,f,used,ki);
sum += x;
cnt += min(1,x);
}
cnt += min(1,res-sum-used[n]);
if(cnt >= 3) {
f = 0;
return 0;
}
sum += used[n];
if(cnt >= 2) {
used[n] = 1;
}
return sum;
}
int main() {
int N;
cin >> N;
vector<int>A(N-1),B(N-1),C(N-1);
vector<vector<int>>ki(N);
for(int i = 0; i < N-1; i++) {
cin >> A[i] >> B[i] >> C[i];
A[i]--;
B[i]--;
ki[A[i]].push_back(B[i]);
ki[B[i]].push_back(A[i]);
}
int l = -1,r = 1001001001;
while (l+1 < r) {
int mid = (l+r)/2;
vector<int>used(N);
for(int i = 0; i < N-1; i++) {
if(C[i] > mid) {
used[A[i]] = used[B[i]] = 1;
}
}
int res = 0;
for(int i = 0; i < N; i++) {
res += used[i];
}
if(res == 0) {
r = mid;
continue;
}
int f = 1;
dfs(0,-1,res,f,used,ki);
if(f == 0) {
l = mid;
continue;
}
int mi = 1001001001,mx = 0;
for(int i = 0; i < N-1; i++) {
if(used[A[i]] && used[B[i]]) {
mi = min(mi,C[i]);
mx = max(mx,C[i]);
}
}
if(mx-mi <= mid) {
r = mid;
}
else {
l = mid;
}
}
cout << r << endl;
}
ぷら