結果
| 問題 |
No.806 木を道に
|
| コンテスト | |
| ユーザー |
沙耶花
|
| 提出日時 | 2020-11-28 18:05:24 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,780 bytes |
| コンパイル時間 | 2,427 ms |
| コンパイル使用メモリ | 210,116 KB |
| 最終ジャッジ日時 | 2025-01-16 09:31:50 |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 9 WA * 18 |
ソースコード
#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
#define rep(i,n) for (int i = 0; i < (n); ++i)
#define Inf 1000000000000000000
struct tree_diameter{
const long long X = 1000000000000000000;
pair<long long,vector<int>> get(vector<vector<pair<int,long long>>> &E){
vector<long long> dis = bfs(E,0);
long long maxi = -1;
int ind = 0;
for(int i=0;i<E.size();i++){
if(dis[i]>maxi){
maxi=dis[i];
ind=i;
}
}
dis = bfs(E,ind);
maxi = -1;
for(int i=0;i<E.size();i++){
if(dis[i]>maxi){
maxi=dis[i];
ind=i;
}
}
vector<int> ret;
ret.push_back(ind);
while(dis[ind]!=0LL){
for(int i=0;i<E[ind].size();i++){
if(dis[ind] == dis[E[ind][i].first] + E[ind][i].second){
ind = E[ind][i].first;
ret.push_back(ind);
break;
}
}
}
return make_pair(maxi,ret);
}
pair<long long,vector<int>> get(vector<vector<int>> &E){
vector<vector<pair<int,long long>>> e(E.size(),vector<pair<int,long long>>());
for(int i=0;i<E.size();i++){
for(int j=0;j<E[i].size();j++){
e[i].emplace_back(E[i][j],1LL);
}
}
return get(e);
}
vector<long long> bfs(vector<vector<pair<int,long long>>> &E,int start){
vector<long long> dis(E.size(),X);
dis[start] = 0LL;
queue<int> Q;
Q.push(start);
while(Q.size()!=0){
int u = Q.front();
Q.pop();
for(int i=0;i<E[u].size();i++){
int v = E[u][i].first;
if(dis[v]!=X)continue;
dis[v] = dis[u] + E[u][i].second;
Q.push(v);
}
}
return dis;
}
};
int main(){
int N;
cin>>N;
vector<vector<int>> E(N,vector<int>());
rep(i,N-1){
int a,b;
cin>>a>>b;
a--;b--;
E[a].push_back(b);
E[b].push_back(a);
}
tree_diameter T;
int x = T.get(E).first;
cout<<N-1-x<<endl;
return 0;
}
沙耶花