逆向並查集(ZOJ 3261)

2021-06-18 13:18:02 字數 1036 閱讀 9930

與並查集不同,給出乙個圖中原有的一些邊,然後給出操作,操作不是向圖中新增邊,而是在已有的邊上,將邊刪除。對於該種情況,需要把首先讀入所有操作,把要求刪除的邊全部刪除,再按照從後往前的順序處理操作,這樣刪邊操作又重新轉化為了添邊的操作。

例題:zoj3261 connections in galaxy war

題目大意:有n個衛星,每個衛星有乙個power值,初始時這些衛星之間有若干條邊,有兩種操作一種是刪邊,另一種是查詢,查詢衛星a,即要求找出與衛星a直接或間接相連的衛星中power值大於該衛星的擁有最大power值的衛星,若兩衛星power值相同且最大輸出編號小的那個。

分析:按上述方法,先刪邊,再反向處理操作,注意該題優先順序的描述,再union中要分類處理。

#include #include #include #include using namespace std;

#define maxn 10010

#define maxm 50010

int query[maxm][2];

int par[maxn],power[maxn];

int ans[maxm];

setg[maxn];

void init(int n)

scanf("%d",&q);

for(int i=0;ib) swap(a,b);

query[i][0]=a; query[i][1]=b;

g[a].erase(g[a].find(b));

}else

}for(int i=0;i::iterator it=g[i].begin();it!=g[i].end();it++)

union(i,*it);

}int cnt=0;

for(int i=q-1;i>=0;i--)

else union(query[i][0],query[i][1]);

}for(int i=cnt-1;i>=0;i--)

printf("%d\n",ans[i]);

}}

zoj 3261 逆向並查集

很明顯是逆向的並查集,建立邊再銷毀,思路也很巧妙的逆向思考 如果正著一一銷毀,相當於倒著一一建邊。所以儲存q次提問,最後倒著來一一建邊。在此之前先把沒有銷毀的邊全部建好 細節power能量注意一下 view code 1 include 2 include 3 include 4 include 5...

zoj3261變形並查集

需要變形的並查集,這題錯了好久,一直沒a掉,終於在重寫第三次的時候a了 先儲存資料,把不需要拆分的邊合併,逆向計算,需要拆分時就合併,之前不知道為啥寫搓了,tle好久 include include include include include include include include in...

zoj3261 並查集 略有變形

題意 有n個星球,每個星球有一定的power值,某些星球是直接或間接相連的。當某個星球想求助時會找到相連的裡面的power值最大而且大於自己的乙個星球。先在給定這些power值並給定兩兩相連的資訊,然後又q個操作,destroy a b是刪除a b直接相連的邊 保證存在 query a求向誰求助,如...