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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Graph Destruction 并查集,图论(500)

發(fā)布時間:2025/3/19 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Graph Destruction 并查集,图论(500) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.


題意 :

  • 給一n個點m條邊的無向圖,問逐漸刪去1-n點及它們的邊,分別輸出當前剩下多少個連通區(qū)域

思路 :

  • 求連通塊,想到了并查集,但并查集是增邊,這里是減邊,只要倒序考慮問題即可,那么問題轉換為 :
  • 逐漸增加n-1點,同時增加當前i點與j點(j>i)(j>i)(j>i)的邊,問添加i點后的連通塊數(shù)量
  • 暴力會tle,考慮優(yōu)化方案,輸入邊時,只存小的往大的邊
  • 對于每個逐漸加入的點i,連通塊個數(shù)先加一;每增加一條邊,如果另一個端點不在同一個并查集內,則連通塊數(shù)量減一
  • 全局變量ans記錄當前連通塊數(shù)量,就不用每次算一遍了
  • 注意最開始還有一個0的狀態(tài),以及最后是加到2為止,而不是1(看圖)
  • 有一個易錯點!!并查集的時候不要輕易u=find(u),因為在循環(huán)里,會改變循環(huán)變量,死循環(huán)
#include <iostream> #include <algorithm> #include <cstring> #include <vector> #include <unordered_set> #include <math.h> #define endl '\n' #define fi first #define se second #define pb push_backusing namespace std; using ll = long long;typedef pair<int, int> PII;const int N = 2e5 + 10;int pa[N];int find(int x) {if (pa[x] != x) pa[x] = find(pa[x]);return pa[x]; }int main() {cin.tie(nullptr) -> sync_with_stdio(false);int n, m; cin >> n >> m;vector<vector<int>> g(n + 1);for (int i = 1, u, v; i <= m && cin >> u >> v; i ++ ) g[u].pb(v);// vector<int> pa(n + 1);for (int i = 1; i <= n; i ++ ) pa[i] = i;vector<int> res = {0};int ans = 0; // 當前連通塊數(shù)量for (int u = n; u >= 2; u -- ){ans ++ ; // 連通塊+1for (auto v : g[u]) // 枚舉每條當前要加的邊{ // u = find(u), v = find(v);int uu = find(u), vv = find(v);if (uu != vv) // 如果當前不在同一連通塊內{ans -- ; // 兩個連通塊合并,連通塊個數(shù)-1pa[uu] = vv; // 連通塊合并}}res.pb(ans);}reverse(res.begin(), res.end());for (auto x : res) cout << x << endl;return 0; }

總結

以上是生活随笔為你收集整理的Graph Destruction 并查集,图论(500)的全部內容,希望文章能夠幫你解決所遇到的問題。

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