zoj 3261 反向並查集 點帶權

2021-09-10 16:48:01 字數 1246 閱讀 8455

題意:n個星球有m個無向邊,每個星球有乙個權值,在現有連邊的基礎上,詢問與該點相連的最大權值點,這個最大權值點必須比自己的權值大,若有多個,則輸出序號最小的。若沒有輸出-1。會有拆邊操作,拆邊後,在該邊不通的基礎上查詢符合點。

題解反向並查集

1.這個比邊帶權的並查集簡單,點帶權注意題目要求就行。

2.因為並查集只能合併和查詢,不能拆邊,所以從上往下進行的拆邊和查詢交替的操作,可以等價於先把將要拆的邊全部拆除,即最後一步查詢時的圖狀態,然後反向進行添邊和查詢交替的操作,然後正向輸出即可。

#include#include#include#include#include#define n 50005

using namespace std ;

int n , m , q ;

int o[n] , a[n] , b[n] , ans[n] ;

bool vis[n] ;

struct edge

edge[n] ;

struct node

node[n] ;

int find(int x)

void union1(int u , int v)

}int main()

scanf("%d" , &m) ;

for(i = 0 ; i < m ; i ++)

scanf("%d%d" , &edge[i].u , &edge[i].v) ;

memset(vis , 0 , sizeof(vis)) ;

scanf("%d" , &q) ;

for(i = 0 ; i < q ; i ++)

else}}

for(i = 0 ; i < m ; i ++)

if(!vis[i])

union1(edge[i].u , edge[i].v) ;

memset(ans , -1 , sizeof(ans)) ;

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

if(o[i] == 1)

else

for(i = 0 ; i < q ; i ++)

if(o[i] == 1)

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

}}

zoj3261 帶權並查集

題目鏈結在這裡 題目大意 n個星球,每個星球有乙個防禦值,一共有m條路,連線x星球和y星球。現在發生星際戰爭了,a星球要尋求幫助,它只能尋求比它的防禦值大的星球的幫助 相同的防禦值的話取下標較小的那個 其中會破壞道路再進行尋求幫助。問每次詢問時,某星球該找哪個星球尋求幫助。思路 這是乙個並查集問題,...

逆向並查集(ZOJ 3261)

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

zoj3261變形並查集

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