生活随笔
收集整理的這篇文章主要介紹了
LeetCode 1617. 统计子树中城市之间最大距离(枚举所有可能+图的最大直径)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
文章目錄
1. 題目
給你 n 個(gè)城市,編號(hào)為從 1 到 n 。同時(shí)給你一個(gè)大小為 n-1 的數(shù)組 edges ,其中 edges[i] = [ui, vi] 表示城市 ui 和 vi 之間有一條雙向邊。
題目保證任意城市之間只有唯一的一條路徑。換句話說(shuō),所有城市形成了一棵 樹(shù) 。
一棵 子樹(shù) 是城市的一個(gè)子集,且子集中任意城市之間可以通過(guò)子集中的其他城市和邊到達(dá)。
兩個(gè)子樹(shù)被認(rèn)為不一樣的條件是至少有一個(gè)城市在其中一棵子樹(shù)中存在,但在另一棵子樹(shù)中不存在。
對(duì)于 d 從 1 到 n-1 ,請(qǐng)你找到城市間 最大距離 恰好為 d 的所有子樹(shù)數(shù)目。
請(qǐng)你返回一個(gè)大小為 n-1 的數(shù)組,其中第 d 個(gè)元素(下標(biāo)從 1 開(kāi)始)是城市間 最大距離 恰好等于 d 的子樹(shù)數(shù)目。
請(qǐng)注意,兩個(gè)城市間距離定義為它們之間需要經(jīng)過(guò)的邊的數(shù)目。
示例 1:
輸入:n
= 4, edges
= [[1,2],[2,3],[2,4]]
輸出:
[3,4,0]
解釋:
子樹(shù)
{1,2}, {2,3} 和
{2,4} 最大距離都是
1 。
子樹(shù)
{1,2,3}, {1,2,4}, {2,3,4} 和
{1,2,3,4} 最大距離都為
2 。
不存在城市間最大距離為
3 的子樹(shù)。示例
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
) 所表示的邊互不相同。
來(lái)源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/count-subtrees-with-max-distance-between-cities
著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系官方授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。
2. 解題
類似題目:LeetCode 1245. 樹(shù)的直徑(圖的最大直徑結(jié)論)
- 先回溯生成所有的子集的可能
- 對(duì)每個(gè)子集,判斷所有點(diǎn)是否聯(lián)通
- 再計(jì)算聯(lián)通圖的最大直徑
選擇任意一點(diǎn)A開(kāi)始bfs,記錄最后遍歷到的點(diǎn)B從B開(kāi)始bfs遍歷,最后到達(dá)的點(diǎn)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/
長(zhǎng)按或掃碼關(guān)注我的公眾號(hào)(Michael阿明),一起加油、一起學(xué)習(xí)進(jìn)步!
總結(jié)
以上是生活随笔為你收集整理的LeetCode 1617. 统计子树中城市之间最大距离(枚举所有可能+图的最大直径)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。