1. 程式人生 > >hdu5923(並查集維護聯通塊)

hdu5923(並查集維護聯通塊)

前一篇博文說這題t了,今天看了一下別人的寫法發現有個地方複雜度確實常數有點大。

對magic tree上的每個點維護它到根的點的集合(並且是原圖的生成樹,這樣點集的大小是O(n)的),這樣的話之後詢問的時候每個點考慮的點數就少了很多。
另外在dfs預處理的時候要充分運用父親的狀態,重新並一遍就會tle。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <vector>

using namespace std
; const int maxn = 505; const int maxm = 10005; int f[maxm][maxn]; vector<int> G[maxm]; int n,m,q; int from[maxm],to[maxm]; int Find(int x,int ty){ return x == f[ty][x] ? x : f[ty][x] = Find(f[ty][x],ty); } void dfs(int u,int fa){ for(int i = 1;i <= n;i++){ f[u][i] = f[fa][i]; } int
fx = Find(from[u],u); int fy = Find(to[u],u); if(fx != fy){ f[u][fx] = fy; } for(int i = 0;i < G[u].size();i++){ int v = G[u][i]; dfs(v,u); } } int main(){ int T; int cas = 0; cin >> T; while(T--){ cin >> n >> m; for
(int i = 1;i <= m;i++) G[i].clear(); for(int i = 2;i <= m;i++){ int par; scanf("%d",&par); G[par].push_back(i); } for(int i = 1;i <= n;i++) f[1][i] = i; for(int i = 1;i <= m;i++){ scanf("%d%d",from + i,to + i); } dfs(1,1); scanf("%d",&q); printf("Case #%d:\n",++cas); for(int i = 1;i <= q;i++){ int ki; scanf("%d",&ki); for(int j = 1;j <= n;j++){ f[0][j] = j; } int num = n; for(int j = 1;j <= ki;j++){ int a;scanf("%d",&a); for(int k = 1;k <= n;k++){ int ty = Find(k,a); if(ty != k){ int x = Find(ty,0); int y = Find(k,0); if(x != y){ num--; f[0][x] = y; } } } } printf("%d\n",num); } } return 0; }

相關推薦

hdu5923(維護聯通)

前一篇博文說這題t了,今天看了一下別人的寫法發現有個地方複雜度確實常數有點大。 對magic tree上的每個點維護它到根的點的集合(並且是原圖的生成樹,這樣點集的大小是O(n)的),這樣的話之後詢問

聯通個數【洛谷P1197】

傳送門:https://www.luogu.org/problemnew/show/P1197 並查集求聯通塊個數。 這個題是每摧毀一個點求一次聯通塊的個數,並查集不容易維護這種摧毀更新的,相反的,並查集可以很好的維護每安裝一個點更新一次這種問題。摧毀和安裝是對立的,既然按順序摧毀,我們就逆

Codeforces 278C Learning Languages() 求連通

pre union get code fin const turn find ons Codeforces 278C Learning Languages(並查集) 求連通塊 為什麽最後還要getfather 一遍 比如 x 是 y 的父親 然後你 Union(x,

poj 1611The Suspects(維護根節點)

The Suspects Time Limit: 1000MS   Memory Limit: 20000K Total Submissions: 51095  

牛客練習賽32 D Tarjan無向圖求橋+維護

題目描述: 小p和他的朋友約定好去遊樂場遊玩,但是他們到了遊樂場後卻互相找不到對方了。 遊樂場可以看做是一張n個點,m條道路的圖,每條道路有邊權wi,表示第一次經過該道路時的花費(第二次及以後經過時花費為0)。 現在,小p要去找他的朋友,但他的朋友行蹤很詭異,小p總是要遍歷完這n個點才能找到他,

BZOJ 1015 &連通

  很久以前,在一個遙遠的星系,一個黑暗的帝國靠著它的超級武器統治者整個星系。某一天,憑著一個偶然的機遇,一支反抗軍摧毀了帝國的超級武器,並攻下了星系中幾乎所有的星球。這些星球通過特殊的以太隧道互相直接或間接地連線。 但好景不長,很快帝國又重新造出了他的超級武器。憑藉這超級武器的力量,帝國開始有計劃地摧毀反抗

Codeforces Round #484 (Div. 2) D. Shark—— 維護區間 + 想法

題意: 給你n天一隻鯊魚每天遊的距離,讓你找一個k,並有三個要求: 1.在每一個區間逗留的天數相同(比如說k=3,那麼假設有5天,1 3 2 4 5,第一天在一個區間逗留,第二第三天在一個區間逗留,只要每天遊的距離不超過k就算在一個區間內) 2.逗留的區間儘可

POJ3694加邊後橋的數目 LCA++強聯通分量

http://poj.org/problem?id=3694 Description A network administrator manages a large network. The network consists of N computers and M links betwee

Codeforces325 D【維護連通性】

思路: 因為是環,所以可以複製一下圖,先判斷一下和他是不是和與他相鄰的8個之一的一個障礙使得構成了一個環,環就是一個連通,用並查集維護即可; 如果沒有就ans++,然後並把這個點加入。 大致意思就是這樣。 #include <cstdio> #include

codeforces—Royal Questions(維護最大基環外向樹)

In a medieval kingdom, the economic crisis is raging. Milk drops fall, Economic indicators are deteriorating every day, money from the treasury disappear.

CodeForces 209C Trails and Glades(歐拉回路判斷+計算聯通分量)

題意:判斷能否構成歐拉回路,不能的話輸出最小需要新增多少條邊 題解:並查集處理出聯通分量,輸入時處理出奇度數點個數,結果即為  奇度數點個數/2+不含奇度數點的聯通分量個數,1節點自動算作一個聯通分量 不管是否有邊連線 #include <cstdio> #i

bzoj4025 二分圖(線段樹分治+帶權維護路徑長奇偶性)

bzoj4025 二分圖 題意: 神犇有一個n個節點的圖。因為神犇是神犇,所以在T時間內一些邊會出現後消失。神犇要求出每一時間段內這個圖是否是二分圖。 資料範圍 n<=100000,m<=200000,T<=100000,1<

poj 1456 Supermarket(維護區間)

 題意:有一些貨物,每個貨物有價值和賣出的截至日期,每天可以賣一個貨物,問能賣出的最大價值是多少。 思路:演算法不難想到,按價值降序排列,對於每一件貨物,從deadline那天開始考慮,如果哪天空

【bzoj 2102】 [HNOI2005]狡猾的商人 帶權維護區間和

以為是掃描演算法,想了半天最後看人家說是並查集我一下子就懵逼了,畢竟是第一次用並查集來維護區間和 這裡為啥要用並查集呢,因為每一段的區間和可以為負數,所以如果兩端區間之間沒有端點相交,那麼就是互不影響

poj-3177(+雙聯通分量+Tarjan算法)

pre ble spl 分享 ++ 每一個 target cstring 就是 題目鏈接:傳送門 思路: 題目要將使每一對草場之間都有至少兩條相互分離的路徑,所以轉化為(一個有橋的連通圖至少加幾條邊才能變為雙聯通圖?) 先將橋刪除,然後原圖變為多個連通塊,每一個連通塊就是一

逆向思維 + 用動態維護連通的個數——Luogu P1197題解

code space 題目 == 個數 sin getch 都是 delete 題目大意: 給你一個 $ n $ 個點的圖與 $ m $ 條邊,接下來給出一個長度為 $ k $ 個整數,按照給出整數的順序依次刪掉對應編號的點,求出一開始的連通塊的個數與接下來每次刪除一個點後

YYHS-猜數字(/線段樹維護

print urn printf ati view pri lose while 從大到小 題目描述 LYK在玩猜數字遊戲。 總共有n個互不相同的正整數,LYK每次猜一段區間的最小值。形如[li,ri]這段區間的數字的最小值一定等於xi。 我

Codeforces 506D Mr. Kitayuta's Colorful Graph(分 +

pair 重新 emp %d 操作 its -- 是否 細節問題 題目鏈接 Mr. Kitayuta‘s Colorful Graph 把每種顏色分開來考慮。 所有的顏色分為兩種:涉及的點的個數 $> \sqrt{n}$ 涉及的點的個數 $<= \s

[BZOJ4537][HNOI2016]最小公倍數(分+)

mit geo can freopen 可能 sca nbsp bzoj names 4537: [Hnoi2016]最小公倍數 Time Limit: 40 Sec Memory Limit: 512 MBSubmit: 1687 Solved: 607[Sub

wenbao與(關於成環與聯通

scn ont unicom audio ios ems Go == bool 1 #include <iostream> 2 #include <string.h> 3 using namespace std; 4 c