文章目錄
1. 題目
給你 n 個城市,編號為從 1 到 n 。同時給你一個大小為 n-1 的數組 edges ,其中 edges[i] = [ui, vi] 表示城市 ui 和 vi 之間有一條雙向邊。
題目保證任意城市之間只有唯一的一條路徑。換句話說,所有城市形成了一棵 樹 。
一棵 子樹 是城市的一個子集,且子集中任意城市之間可以通過子集中的其他城市和邊到達。
兩個子樹被認為不一樣的條件是至少有一個城市在其中一棵子樹中存在,但在另一棵子樹中不存在。
對于 d 從 1 到 n-1 ,請你找到城市間 最大距離 恰好為 d 的所有子樹數目。
請你返回一個大小為 n-1 的數組,其中第 d 個元素(下標從 1 開始)是城市間 最大距離 恰好等于 d 的子樹數目。
請注意,兩個城市間距離定義為它們之間需要經過的邊的數目。
示例 1:
輸入:n
= 4, edges
= [[1,2],[2,3],[2,4]]
輸出:
[3,4,0]
解釋:
子樹
{1,2}, {2,3} 和
{2,4} 最大距離都是
1 。
子樹
{1,2,3}, {1,2,4}, {2,3,4} 和
{1,2,3,4} 最大距離都為
2 。
不存在城市間最大距離為
3 的子樹。示例
2:
輸入:n
= 2, edges
= [[1,2]]
輸出:
[1]示例
3:
輸入:n
= 3, edges
= [[1,2],[2,3]]
輸出:
[2,1]提示:
2 <= n
<= 15
edges
.length
== n
-1
edges
[i
].length
== 2
1 <= ui
, vi
<= n
題目保證
(ui
, vi
) 所表示的邊互不相同。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/count-subtrees-with-max-distance-between-cities
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
2. 解題
類似題目:LeetCode 1245. 樹的直徑(圖的最大直徑結論)
- 先回溯生成所有的子集的可能
- 對每個子集,判斷所有點是否聯通
- 再計算聯通圖的最大直徑
選擇任意一點A開始bfs,記錄最后遍歷到的點B從B開始bfs遍歷,最后到達的點C,BC的距離就是最大直徑
class Solution {vector
<int> ans
;vector
<vector
<int>> g
;vector
<int> sub
;int N
;
public:vector
<int> countSubgraphsForEachDiameter(int n
, vector
<vector
<int>>& edges
) {N
= n
;sub
= vector
<int> (n
, 0);ans
= vector
<int> (n
-1, 0);g
.resize(n
);for(auto& e
: edges
){g
[e
[0]-1].push_back(e
[1]-1);g
[e
[1]-1].push_back(e
[0]-1);}dfs(0);return ans
;}void dfs(int i
){if(i
== N
){int d
= calculateD();if(d
!= -1)ans
[d
-1]++;return;}dfs(i
+1);sub
[i
] = 1;dfs(i
+1);sub
[i
] = 0;}int calculateD(){int start
= -1;for(int i
= 0; i
< N
&& start
== -1; ++i
)if(sub
[i
] == 1)start
= i
;int last
= bfs(start
, true);if(last
== -1)return -1;return bfs(last
, false);}int bfs(int id
, bool option
){int count
= 0, total
= accumulate(sub
.begin(),sub
.end(),0);if(total
<= 1)return -1;int last
, size
, step
= 0;vector
<int> unvis(sub
);queue
<int> q
;q
.push(id
);unvis
[id
] = 0;while(!q
.empty()){size
= q
.size();while(size
--){last
= id
= q
.front();q
.pop();count
++;for(int nt
: g
[id
]){if(unvis
[nt
]){unvis
[nt
] = 0;q
.push(nt
);}}}step
++;}if(option
== true){if(count
!= total
)return -1;return last
;}else{return step
-1;}}
};
1140 ms 399.6 MB
我的CSDN博客地址 https://michael.blog.csdn.net/
長按或掃碼關注我的公眾號(Michael阿明),一起加油、一起學習進步!
總結
以上是生活随笔為你收集整理的LeetCode 1617. 统计子树中城市之间最大距离(枚举所有可能+图的最大直径)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。