日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

LeetCode 1617. 统计子树中城市之间最大距离(枚举所有可能+图的最大直径)

發布時間:2024/7/5 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode 1617. 统计子树中城市之间最大距离(枚举所有可能+图的最大直径) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 1. 題目
    • 2. 解題

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);//以任意一點開始bfsif(last == -1)//圖不連通,返回return -1;return bfs(last, false);//以last點開始bfs求最大直徑}int bfs(int id, bool option){int count = 0, total = accumulate(sub.begin(),sub.end(),0);if(total <= 1)return -1;// 少于2個點,不滿足題意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. 统计子树中城市之间最大距离(枚举所有可能+图的最大直径)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。