題意: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...