@@ -2725,35 +2725,37 @@ vector<int> findDiameter(pii &pointA, pii &pointB)
27252725
27262726
27272727```cpp
2728- const int MAXN = 1e5;
27292728int n;
2730- vector<int> adj[MAXN+1] ;
2731- int source[MAXN+1], dist[MAXN+1], secondMaxDist[MAXN+1] ;
2732- int DFS (int u = 0 , int par = -1)
2729+ vector<vector< int>> adj;
2730+ vector< int> dist;
2731+ void dfs (int u, int par = -1)
27332732{
2734- int mx = 0, pt = -1, secondMx = 0;
2735- for (auto &v : adj[u])
2733+ for (const int v : adj[u])
27362734 {
27372735 if (v == par) continue;
2738- int cur = DFS(v, u);
2739- if (cur > mx) mx = cur, pt = v;
2740- else if (cur > secondMx) secondMx = cur;
2736+ dist[v] = dist[u]+1;
2737+ dfs(v, u);
27412738 }
2742- source[u] = pt, dist[u] = mx+1, secondMaxDist[u] = secondMx+1;
2743- return mx+1;
27442739}
2745- int DFS2(int u = 0, int par = -1 )
2740+ vector< int> allLongestPath( )
27462741{
2747- if (par != -1)
2748- {
2749- dist[u] = max(dist[u], (source[par] == u) ? secondMaxDist[par]+1 : dist[par]+1);
2750- if (dist[u] == dist[par]+1 || dist[u] == secondMaxDist[par]+1) source[u] = par;
2751- }
2752- for (auto &v : adj[u])
2753- {
2754- if (v == par) continue;
2755- DFS2(v, u);
2756- }
2742+ vector<int> res(n+1, 0);
2743+ dfs(1);
2744+
2745+ int optimal = 0;
2746+ for (int i = 1; i <= n; ++i)
2747+ if (dist[i] > dist[optimal]) optimal = i;
2748+ fill(dist.begin(), dist.end(), 0);
2749+ dfs(optimal);
2750+ for (int i = 1; i <= n; ++i) res[i] = dist[i];
2751+
2752+ for (int i = 1; i <= n; ++i)
2753+ if (dist[i] > dist[optimal]) optimal = i;
2754+ fill(dist.begin(), dist.end(), 0);
2755+ dfs(optimal);
2756+ for (int i = 1; i <= n; ++i) res[i] = max(res[i], dist[i]);
2757+
2758+ return res;
27572759}
27582760```
27592761
0 commit comments