題目鏈結在這裡
題目大意
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...