zoj3261 帶權並查集

2021-09-08 17:48:42 字數 1252 閱讀 6469

題目鏈結在這裡

題目大意

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

思路

這是乙個並查集問題,如果順著題目的思路來的話,要進行拆邊。但是並查集沒有拆邊的功能,所以我們轉換思路,先處理最後的詢問,然後依次往前進行路的合併。這樣就簡單一點。

**如下

#include #include #include #include #include #define rep(i, x) for(int i = 0; i < x; ++i)

#define clr(x) memset(x, 0, sizeof(x))

using namespace std;

const int maxn = 10010;

const int maxm = 20010;

const int maxq = 50010;

struct queryquery[maxq];

struct edgeedge[maxm * 2];

int n, m, q;

int r[maxn], par[maxn];

int head[maxn], tol;

int x[maxm], y[maxm];

int ans[maxq], cnt;

void addedge(int x, int y)

void init()

int find(int x)

bool unite(int x, int y)

void solve()

}if(flag) continue;

unite(xx, yy);

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

else

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

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

}int main()

scanf("%d", &q);

char str[10];

rep(i, q)

else

}solve();

}return 0;

}

zoj 3261 反向並查集 點帶權

題意 n個星球有m個無向邊,每個星球有乙個權值,在現有連邊的基礎上,詢問與該點相連的最大權值點,這個最大權值點必須比自己的權值大,若有多個,則輸出序號最小的。若沒有輸出 1。會有拆邊操作,拆邊後,在該邊不通的基礎上查詢符合點。題解 反向並查集 1.這個比邊帶權的並查集簡單,點帶權注意題目要求就行。2...

逆向並查集(ZOJ 3261)

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

zoj3261變形並查集

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