国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當前位置: 首頁 > news >正文

太原推廣型網(wǎng)站制作汕頭seo快速排名

太原推廣型網(wǎng)站制作,汕頭seo快速排名,珠海網(wǎng)站建設(shè)陳玉銘,中文域名有哪些網(wǎng)站2846. 邊權(quán)重均等查詢 難度: 困難 題目大意: 現(xiàn)有一棵由 n 個節(jié)點組成的無向樹,節(jié)點按從 0 到 n - 1 編號。給你一個整數(shù) n 和一個長度為 n - 1 的二維整數(shù)數(shù)組 edges ,其中 edges[i] [ui, vi, wi] 表示樹中存在一條位于節(jié)點 …

2846. 邊權(quán)重均等查詢

難度: 困難

題目大意:

現(xiàn)有一棵由 n 個節(jié)點組成的無向樹,節(jié)點按從 0n - 1 編號。給你一個整數(shù) n 和一個長度為 n - 1 的二維整數(shù)數(shù)組 edges ,其中 edges[i] = [ui, vi, wi] 表示樹中存在一條位于節(jié)點 ui 和節(jié)點 vi 之間、權(quán)重為 wi 的邊。

另給你一個長度為 m 的二維整數(shù)數(shù)組 queries ,其中 queries[i] = [ai, bi] 。對于每條查詢,請你找出使從 aibi 路徑上每條邊的權(quán)重相等所需的 最小操作次數(shù) 。在一次操作中,你可以選擇樹上的任意一條邊,并將其權(quán)重更改為任意值。

注意:

  • 查詢之間 相互獨立 的,這意味著每條新的查詢時,樹都會回到 初始狀態(tài) 。
  • aibi的路徑是一個由 不同 節(jié)點組成的序列,從節(jié)點 ai 開始,到節(jié)點 bi 結(jié)束,且序列中相鄰的兩個節(jié)點在樹中共享一條邊。

返回一個長度為 m 的數(shù)組 answer ,其中 answer[i] 是第 i 條查詢的答案。

提示:

  • 1 <= n <= 10^4
  • edges.length == n - 1
  • edges[i].length == 3
  • 0 <= ui, vi < n
  • 1 <= wi <= 26
  • 生成的輸入滿足 edges 表示一棵有效的樹
  • 1 <= queries.length == m <= 2 * 10^4
  • queries[i].length == 2
  • 0 <= ai, bi < n

示例 1:
請?zhí)砑訄D片描述

輸入:n = 7, edges = [[0,1,1],[1,2,1],[2,3,1],[3,4,2],[4,5,2],[5,6,2]], queries = [[0,3],[3,6],[2,6],[0,6]]
輸出:[0,0,1,3]
解釋:第 1 條查詢,從節(jié)點 0 到節(jié)點 3 的路徑中的所有邊的權(quán)重都是 1 。因此,答案為 0 。
第 2 條查詢,從節(jié)點 3 到節(jié)點 6 的路徑中的所有邊的權(quán)重都是 2 。因此,答案為 0 。
第 3 條查詢,將邊 [2,3] 的權(quán)重變更為 2 。在這次操作之后,從節(jié)點 2 到節(jié)點 6 的路徑中的所有邊的權(quán)重都是 2 。因此,答案為 1 。
第 4 條查詢,將邊 [0,1]、[1,2]、[2,3] 的權(quán)重變更為 2 。在這次操作之后,從節(jié)點 0 到節(jié)點 6 的路徑中的所有邊的權(quán)重都是 2 。因此,答案為 3 。
對于每條查詢 queries[i] ,可以證明 answer[i] 是使從 ai 到 bi 的路徑中的所有邊的權(quán)重相等的最小操作次數(shù)。

分析

如果暴力寫的話, 那么對于每一個查詢,我們要dfs一遍,每一遍存一下路徑上的邊權(quán)得數(shù)量,最后用總的數(shù)量減去最多的變得數(shù)量就是答案,這是一個小貪心的思路,那么考慮一下數(shù)據(jù)范圍,如果暴力寫的話,時間復(fù)雜度是 O ( n 2 ) O(n^2) O(n2),肯定會超時的,但是也吧暴力寫法的代碼貼出來。

723 / 733 個通過的測試用例

暴力 dfs (會超時)

class Solution {
public:vector<int> minOperationsQueries(int n, vector<vector<int>>& edges, vector<vector<int>>& queries) {int m = queries.size();vector<int> e(n << 1), ne(n << 1), h(n, -1), w(n << 1), ans(m); // 鏈式向前星int cnt[27], idx = 0;// addfunction<void(int, int, int)> add = [&](int a, int b, int c) {e[idx] = b, ne[idx] = h[a], w[idx] = c, h[a] = idx ++;e[idx] = a, ne[idx] = h[b], w[idx] = c, h[b] = idx ++;}; // add// dfsfunction<bool(int, int, int)> dfs = [&](int u, int b, int fa) {if (u == b) {return true;}for (int i = h[u]; ~i; i = ne[i]) {int j = e[i];if (j == fa) continue;if (dfs(j, b, u)) {++ cnt[w[i]];return true;}}return false;}; // dfsfor (int i = 0; i < n - 1; i ++ ) {int a = edges[i][0], b = edges[i][1], w = edges[i][2];add(a, b, w);}for (int i = 0; i < m; i ++) {memset(cnt, 0, sizeof cnt); // 每次清空數(shù)組int a = queries[i][0], b = queries[i][1];dfs(a, b, -1);int res = 0, sum = 0;for (int i = 1; i <= 26; i ++) {sum += cnt[i];res = max(res, cnt[i]);}ans[i] = sum - res;}return ans;}
};

時間復(fù)雜度: O ( n ? m ? W ) O(n*m*W) O(n?m?W) (本題 W = 26)

分析

我們可以用最近公共祖先的思想,選定一個根節(jié)點,假設(shè)是0,那么定義一個cnt[i][w]表示節(jié)點i到根節(jié)點的路徑中邊權(quán)為w(1 <= w <= 26)的邊的數(shù)量,那么ij之間邊權(quán)為w的邊數(shù)是 t a = c n t [ i ] [ w ] + c n t [ j ] [ w ] ? 2 ? c n t [ l c a ( i , j ) ] [ w ] t_a = cnt[i][w] + cnt[j][w] - 2 * cnt[lca(i, j)][w] ta?=cnt[i][w]+cnt[j][w]?2?cnt[lca(i,j)][w]lca(i, j)表示節(jié)點i和節(jié)點j的最近公共祖先, 那么要替換的邊數(shù)就是
∑ i = 1 26 t i ? max ? 1 < = i < = 26 t i \sum_{i = 1}^{26} {t_i} - \max_{1 <= i <= 26}t_i i=126?ti??1<=i<=26max?ti?
使用離線算法tarjan算法模板

tarjan + 并查集

class Solution {
public:using PII = pair<int, int>;vector<int> minOperationsQueries(int n, vector<vector<int>>& edges, vector<vector<int>>& queries) {int m = queries.size();vector<unordered_map<int, int>> g(n);for (auto& e : edges) {g[e[0]][e[1]] = e[2];g[e[1]][e[0]] = e[2];}vector<vector<PII>> q(n);   for (int i = 0; i < m; i ++ ){q[queries[i][0]].push_back({queries[i][1], i});q[queries[i][1]].push_back({queries[i][0], i});}vector<int> lca(m), vis(n), p(n);iota(p.begin(), p.end(), 0);vector<vector<int>> cnt(n, vector<int>(27));function<int(int)> find = [&](int x) {if (x != p[x]) p[x] = find(p[x]);return p[x];};function<void(int, int)> tarjan = [&](int u, int fa) {if (fa != -1) {cnt[u] = cnt[fa];++ cnt[u][g[u][fa]];}p[u] = u;for (auto& e : g[u]) {if (e.first == fa) continue;tarjan(e.first, u);p[e.first] = u;}for (auto& e : q[u]) {if (u != e.first && !vis[e.first]) continue;lca[e.second] = find(e.first);}vis[u] = 1;};tarjan(0, -1);vector<int> res(m);for (int i = 0; i < m; i ++ ){int sum = 0, mx = 0;for (int j = 1; j <= 26;j ++) {int t = cnt[queries[i][0]][j] + cnt[queries[i][1]][j] - 2 * cnt[lca[i]][j];mx = max(mx, t);sum += t;}res[i] = sum - mx;}return res;}
};

時間復(fù)雜度: O ( ( m + n ) × W + m × l o g n ) O((m+n)×W+m×logn) O((m+n)×W+m×logn) (本題 W = 26)

在線lca算法

const int N = 10010;
class Solution {
public:int e[N << 1], ne[N << 1], w[N << 1], h[N],  idx;int fa[N][15], depth[N];int cnt[N][27], cntn[27];int q[N];void bfs() {int hh = 0, tt = 0;q[0] = 1;memset(depth, 0x3f, sizeof depth);depth[0] = 0, depth[1] = 1;while (hh <= tt) {int t = q[hh ++ ];for (int i = h[t]; ~i; i = ne[i]) {int j = e[i];if (depth[j] > depth[t] + 1) {depth[j] = depth[t] + 1;q[ ++ tt] = j;fa[j][0] = t;for (int k = 1; k <= 14; k ++ )fa[j][k] = fa[fa[j][k - 1]][k - 1];}}}}// dfs版本void dfs_dep(int u, int father) {depth[u] = depth[father] + 1;fa[u][0] = father;for (int i = 1; i <= 14; i ++) fa[u][i] = fa[fa[u][i - 1]][i - 1];for (int i = h[u]; ~i; i = ne[i]) {if (e[i] != father) {dfs_dep(e[i], u);}}}void add(int a, int b, int c) {e[idx] = b, ne[idx] = h[a], w[idx] = c, h[a] = idx ++ ;}void dfs(int u, int fa) {memcpy(cnt[u], cntn, sizeof cntn);for (int i = h[u]; ~i; i = ne[i]) {int j = e[i];if (fa == j) continue;cntn[w[i]] ++;dfs(j, u);cntn[w[i]] -- ;}}int lca(int a, int b){if (depth[a] < depth[b]) swap(a, b);for (int k = 14; k >= 0; k -- )if (depth[fa[a][k]] >= depth[b]) a = fa[a][k];if (a == b) return a;for (int k = 14; k >= 0; k -- ) {if (fa[a][k] != fa[b][k]) {a = fa[a][k];b = fa[b][k];}}return fa[a][0];}vector<int> minOperationsQueries(int n, vector<vector<int>>& edges, vector<vector<int>>& queries) {memset(h, -1,sizeof h);for (int i = 0; i < edges.size(); i ++ ) {int a = edges[i][0], b = edges[i][1], c = edges[i][2];a ++, b ++ ;add(a, b, c), add(b, a, c);}bfs();// dfs_dep(1, 0); // dfs_dep版本dfs(1, -1);vector<int> ans(queries.size());for (int i = 0; i < queries.size(); i ++ ) {int a = queries[i][0], b = queries[i][1];a ++, b ++ ;int p = lca(a, b);vector<int> s(27);for (int j = 1; j <= 26; j ++ )s[j] += cnt[a][j] + cnt[b][j] - cnt[p][j] * 2;int sum = 0, maxv = 0;for (int j = 1; j <= 26; j ++ ) {maxv = max(maxv, s[j]);sum += s[j];}ans[i] = sum - maxv;}return ans;}
};

時間復(fù)雜度: O ( m l o g n ) O(mlogn) O(mlogn)

http://m.aloenet.com.cn/news/35719.html

相關(guān)文章:

  • 房山網(wǎng)站建設(shè)網(wǎng)絡(luò)seo哈爾濱
  • 政府網(wǎng)站建設(shè)分析專注于seo顧問
  • 如何進行網(wǎng)站維護seo云優(yōu)化如何
  • 動態(tài)網(wǎng)站設(shè)計與開發(fā)心得體會貴陽關(guān)鍵詞優(yōu)化平臺
  • 齊諾網(wǎng)站建設(shè)成都私人做網(wǎng)站建設(shè)
  • 好域名做網(wǎng)站微信視頻號怎么推廣引流
  • 先做它個天貓網(wǎng)站百度搜索關(guān)鍵詞
  • 做網(wǎng)站的流程分析-圖靈吧百度指數(shù)查詢app
  • wordpress blod關(guān)鍵詞是網(wǎng)站seo的核心工作
  • 旅游網(wǎng)站建設(shè)的目的及功能定位優(yōu)幫云首頁推薦
  • 博客網(wǎng)站的建設(shè)手機百度網(wǎng)盤下載慢怎么解決
  • 自己做網(wǎng)站可以隨便起名字嗎友情鏈接站長平臺
  • 什么行業(yè)做網(wǎng)站百度指數(shù)數(shù)據(jù)
  • 建設(shè)銀行官方網(wǎng)站地址新品牌推廣策略
  • 橋頭鎮(zhèn)網(wǎng)站仿做電商網(wǎng)頁
  • 大城網(wǎng)站制作新手怎么做網(wǎng)頁
  • 微信推送怎么做購物網(wǎng)站360搜索引擎網(wǎng)址
  • 成都捕魚網(wǎng)站建設(shè)昆明seo培訓(xùn)
  • 服務(wù)器網(wǎng)站綁定域名網(wǎng)站建設(shè)最新中央人事任免
  • 個人做網(wǎng)站賺錢太原做網(wǎng)站的
  • 網(wǎng)站域名查企業(yè)郵箱黃頁
  • 創(chuàng)建網(wǎng)站主題在哪里近期重大新聞
  • 電視直播網(wǎng)站開發(fā)神童預(yù)言新冠2023結(jié)束
  • 做場景秀的網(wǎng)站長尾關(guān)鍵詞舉例
  • 學(xué)做網(wǎng)站必須php嗎seo jsbapp9
  • 做國外網(wǎng)站關(guān)鍵詞用寫營銷推廣內(nèi)容
  • 不用fash做的視頻網(wǎng)站個人怎么做網(wǎng)站
  • 網(wǎng)站開發(fā)投標書范本目錄阿里云域名注冊查詢
  • vb實現(xiàn)asp網(wǎng)站開發(fā)百度圖像搜索
  • 建站寶盒做的網(wǎng)站遼源seo