日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

每日一题:leetcode1579.保证图可完全遍历

發布時間:2023/11/30 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 每日一题:leetcode1579.保证图可完全遍历 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目描述

題目分析

非常慚愧,感覺自己有點畏難心理,看到是困難題第一個想法是自己想不出來。。。
因為自己認為自己做不出來,所以完全不能進行思考,稍微思考一下就覺得不行不行。
我也想到了分別用兩個并查集判斷各自可以去掉多少邊,但是一想到還有公共邊,就感覺一頭亂麻,不知道從什么地方下手。
當時主要感覺困難的地方在于,如果兩個人去掉的公共邊不一樣,則沒有辦法統一。
看了題解以后我覺得我這個想法離正確的思路已經非常近了,抓住公共邊這個矛盾再進行思考應該就可以。
另一方面還應該有跳出思維定勢的能力,不能因為題目中先說的是私有邊再說的是公有邊自己也只能這樣思考,要把條件翻來覆去進行轉換才行。
回過頭觀察公共邊:很容易覺得公共邊比私有邊重要(因為公有邊兩個人都可以用
我當時也想到公共邊比較重要,但是又想到兩個人可能用的公共邊不一樣。這其實就是思維定勢:主觀覺得一定要先使用私有邊,不夠的再是使用公有邊。
如果先盡量使用公有邊再使用私有邊的話一切都將豁然開朗。因為在圖的連通中使用并查集就表征了邊的極大誘導子圖(好像是這么說,可能不準確,意思就是每個連通分量已經是最大了)。因此丟去的公有邊無論是哪條都無所謂(不會影響連通情況)。然后再分別考慮私有邊。

AC代碼

class UnionSet { public:int n;int setCount;vector<int> father;vector<int> size;UnionSet(int _n):n(_n),setCount(_n),father(_n),size(_n, 1) {iota(father.begin(), father.end(), 0);}UnionSet() {}int root(int x) {return x == father[x] ? x : father[x] = root(father[x]);}bool unite(int x, int y) {x = root(x);y = root(y);if (x == y) {return false;}if (size[x] < size[y]) {swap(x, y);}father[y] = x;size[x] += size[y];--setCount;return true;} }; class Solution { public:int maxNumEdgesToRemove(int n, vector<vector<int>>& edges) {for (auto &edge : edges) {--edge[1];--edge[2];}int ans = 0;UnionSet us(n);// UnionSet us_a(n);// UnionSet us_b(n);for (auto &edge : edges) {if (edge[0] == 3) {//遍歷公共邊if (us.unite(edge[1], edge[2])) {// us_b.unite(edge[1], edge[2]);} else {++ans;}}}//計算Alice的聯通UnionSet us_a;us_a.n = n;us_a.father = us.father;us_a.setCount = us.setCount;us_a.size = us.size;for (auto &edge : edges) {if (edge[0] == 1) {if (us_a.unite(edge[1], edge[2])) {} else {++ans;}}}if (us_a.setCount != 1) {return -1;}//計算Bob的聯通UnionSet us_b;us_b.n = n;us_b.father = us.father;us_b.setCount = us.setCount;us_b.size = us.size;for (auto &edge : edges) {if (edge[0] == 2) {if (us_b.unite(edge[1], edge[2])) {} else {++ans;}}}if (us_b.setCount != 1) {return -1;}return ans;} };

總結

以上是生活随笔為你收集整理的每日一题:leetcode1579.保证图可完全遍历的全部內容,希望文章能夠幫你解決所遇到的問題。

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