题目链接在这里
题目大意
n个星球,每个星球有一个防御值,一共有m条路,连接x星球和y星球。现在发生星际战争了,a星球要寻求帮助,它只能寻求比它的防御值大的星球的帮助(相同的防御值的话取下标较小的那个),其中会破坏道路再进行寻求帮助。问每次询问时,某星球该找哪个星球寻求帮助。
思路
这是一个并查集问题,如果顺着题目的思路来的话,要进行拆边。但是并查集没有拆边的功能,所以我们转换思路,先处理最后的询问,然后依次往前进行路的合并。这样就简单一点。
代码如下
#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
#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 Query{
bool flag;
int x, y;
}query[MaxQ];
struct Edge{
int y, nxt;
}edge[MaxM * 2]