發表文章

目前顯示的是有「樹直徑」標籤的文章

[AtCoder] [經典競程 90 題] 003 - Longest Circular Road(★4)

題目連結: https://atcoder.jp/contests/typical90/tasks/typical90_c 題目大意: 給你一棵樹,詢問在樹上加入一條邊後最長的環可以是多長。 樹直徑就會是這題答案了。 #include <bits/stdc++.h> using namespace std; int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); int n; cin >> n; vector<vector<int>> g(n); for (int i = 1; i < n; ++i) { int u, v; cin >> u >> v; g[--u].emplace_back(--v); g[v].emplace_back(u); } int ans = 0; auto dfs = [&g, &ans] (auto rec, int u, int f) -> int { int mx1 = 0, mx2 = 0; for (int v: g[u]) { if (v == f) continue; int s = rec(rec, v, u); if (s >= mx1) { mx2 = mx1; mx1 = s; } else if (s >= mx2) { mx2 = s; } } ans = max(ans, mx1 + mx2); ...

[TIOJ] 1152. 1.銀河帝國旅行社

題目連結: http://tioj.infor.org/problems/1152 裸的樹直徑題,那樹直徑要怎麼做呢?有個greedy的做法:先隨便從一個點DFS下去,走到最遠的地方後,再從那個點DFS下去走到離他最遠的點,則這兩個點中間的路徑就會是直徑。 #include <bits/stdc++.h> using namespace std; #define PB push_back typedef pair<int,int> PII; #define FF first #define SS second const int N = 10000 + 5; vector<int> G[N]; void dfs(int,int,int,PII&); int main(){ ios_base::sync_with_stdio(0);cin.tie(0); int n; cin>>n; for(int i=0;i<n;i++){ int x; while(cin>>x and x!=-1){ G[i].PB(x); G[x].PB(i); } } PII ans = {0, -1}; dfs(0, 0, 0, ans); ans.SS = -1; dfs(ans.FF, ans.FF, 0, ans); cout<<ans.SS<<'\n'; return 0; } void dfs(int w, int f, int sum, PII& ret){ if(sum > ret.SS) ret = {w, sum}; for(auto i: G[w]){ if(i==f) continue;...