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