逆向並查集(zoj 3261,hdoj 4496)

2021-09-26 05:57:42 字數 2694 閱讀 7194

zoj 3261connections in galaxy war

題目大意:銀河中一些星球之間有通道可以聯絡,然而另乙個維度的怪物將某些聯絡破壞了。因此當有些星球需要幫助時,就需要判斷一下能不能找到乙個直接或間接聯絡的星球,並且這個星球的力量是與該星球連線的所有星球中最大的。如果有這麼乙個星球,則輸出該星球的編號,如果有多個星球是最大的,輸出編號最小的那個。如果找不到這樣的星球,則輸出「-1」。

在輸入中,首先輸入星球個數n,第二行是n個數,表示每個星球的力量。下一行是乙個整數m,表示所有的聯絡個數,下面是m行,每行兩個整數,表示哪兩個星球有聯絡。下一行是乙個整數q,表示處理個數,有兩種情況:

第一種是:destroy a b 表示摧毀a,b之間的聯絡

第二種是:query a 表示詢問a星球能否得到幫助

ac**:

#include

#include

#include

#include

#include

using

namespace std;

const

int max=

10001

;int power[max]

;//每個行星的戰鬥力

map<

int,

int>mp[max]

;//存邊,以及邊的編號

int used[

2*max]

;//與map相結合,記錄哪條邊需要刪除

int parent[max]

;int ans[

5*max]

;int n;

struct edge//記錄邊,方便通過下標查詢連線兩個邊的節點

edges[

2*max]

;struct ques//記錄問題,如果是destroy ,mark 記為1,如果是query,mark記為0

que[

5*max]

;struct re//要求的最大力量和最小的編號

res[max]

;void

init()

//初始化

}int

find_root

(int x)

void

unite

(int x,

int y)

else

if(res[x]

.height==res[y]

.height&&res[x]

.num.num)

res[y]

.num=res[x]

.num;}}

intmain()

int q;

scanf

("%d"

,&q)

;for

(int i=

0;i)else

}for

(int i=

0;i)//將沒被刪除的邊先合併成集合

int t=0;

for(

int i=q-

1;i>=

0;i--

)else

unite

(que[i]

.x,que[i]

.y);

//將刪除邊轉化為合併邊

}for

(int i=t-

1;i>=

0;i--

)printf

("%d\n"

,ans[i]);

}}

hdoj 4496d-city

題目大意:乙個怪獸要把整個d城的聯絡全部摧毀,題目要求輸出在摧毀乙個聯絡時還剩多少分塊。當且僅當它們直接或間接地彼此連線時,兩個點在相同的連線塊中。

題解:同上題一樣,離線處理,只不過這題比較簡單,因為是「全部摧毀」,所以在最後總是輸出節點個數。這題用二維陣列存邊,開乙個 edge[max][2] 陣列,聯絡的第乙個數存在edge[i][0]裡,第二個數存在edge[i][1]裡(這種存邊方法好巧妙哦~, 原諒乙個菜鳥沒見過世面 )。

ac**:

#include

#include

#include

using

namespace std;

const

int max=

10001

;int parent[max]

;int edge[

10*max][2

];int ans[

10*max]

;int n,m;

void

init()

}int

find_root

(int x)

bool

unite

(int x,

int y)

return

false;}

intmain()

for(

int i=m-

1;i>=

0;i--

)for

(int i=

0;i)printf

("%d\n"

,ans[i]);

}}

逆向並查集(ZOJ 3261)

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

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...