高橋くんと木の直径
問題
D – 高橋くんと木の直径
プログラミング初級者から上級者まで楽しめる、競技プログラミングコンテストサイト「AtCoder」。オンラインで毎週開催プログラミングコンテストを開催しています。競技…
記録
- 2022/4/9,10 OK。
- 2022/4/8 解法わからず。
解法
- 【木の直径の求め方】
1.頂点1から各頂点の距離を求め、最大値の頂点を探す。
2.最大値の頂点から各頂点の最短距離を得ることができるので、これらの最大値が木の直径となる。
コード例
#include <bits/stdc++.h> using namespace std; #include <atcoder/all> using namespace atcoder; using ll = long long; using P = pair<int, int>; #define rep(i, n) for(int i = 0; i < (n); ++i) // using mint = modint998244353; // using mint = modint1000000007; // const int mod = 1000000007; // const ll INF = 1LL << 60; // const int INF = 1001001001; int main() { int N; cin >> N; // 頂点1から各頂点の距離を求め、最大値の頂点を探す int mx = 0; int mxi = 0; for(int i = 1; i < N; ++i) { cout << "? " << 1 << " " << i + 1 << endl; int dist; cin >> dist; if(mx < dist) { mx = dist; mxi = i; } } // 最大値の頂点から各頂点の距離の最大値が木の直径となる int ans = 0; rep(i, N) { if(i == mxi) { continue; } cout << "? " << mxi + 1 << " " << i + 1 << endl; int dist; cin >> dist; ans = max(ans, dist); } cout << "! " << ans << endl; return 0; }