quailty's Contest #1 A1 道路修建 Small

时间:2023-03-09 00:17:43
quailty's Contest #1 A1 道路修建 Small

暴力。每次合并两个点之后,把新产生的连通关系都记录下来。

#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstring>
using namespace std; int T, n, m, p, u, v, G;
int lastans, thisans;
int fa[ + ];
int d[ + ][ + ];
vector<int>c1;
vector<int>c2; int get(int x){
while (fa[x] != x)
x = fa[x] = fa[fa[x]];
return x;
} int main()
{
scanf("%d", &T);
while (T--)
{
scanf("%d%d", &n, &m); G = n;
memset(d, -, sizeof d);
lastans = ;
for (int i = ; i <= n; i++) fa[i] = i; for (int i = ; i <= m; i++)
{
scanf("%d%d%d", &p, &u, &v);
u = (u^lastans);
v = (v^lastans); if (p == )
{
int fu = get(u);
int fv = get(v); if (fu != fv)
{
G--;
c1.clear();
c2.clear(); for (int j = ; j <= n; j++)
{
int fi = get(j);
if (fi == fu) c1.push_back(j);
if (fi == fv) c2.push_back(j);
}
for (int a = ; a < c1.size(); a++)
for (int b = ; b < c2.size(); b++)
if (d[c1[a]][c2[b]] == -){
d[c1[a]][c2[b]] = i;
d[c2[b]][c1[a]] = i;
}
thisans = G;
fa[fu] = fv;
}
else
{
thisans = G;
}
}
else
{
if (d[u][v] == -) thisans = ;
else thisans = d[u][v];
}
printf("%d\n", thisans);
lastans = thisans;
}
}
return ;
}