没人写题解,我就先来一发,刚学了并查集,一看这题,妥妥的模板提,趁势来一发,结果T了,然后不管怎么调,怎么改,都是超时,然后就想到yxc大佬在视频中讲过的,在数据大的时候用scanf比cin用时少,就试了一下,哈哈哈,过了。怎么说还是自己基础不行
#include<iostream>
using namespace std;
int parent[100005]; //parent[i] = j 表示i的父亲是j
int length[100005]; //当前点离祖宗的距离
int n,m;
int find_root(int x)
{
int x_root = x;
while(parent[x_root] != -1)
{
x_root = parent[x_root];
}
return x_root;
}
void union_root(int x,int y)
{
int x_root = find_root(x);
int y_root = find_root(y);
if(x_root != y_root) //不等相当于当前不是亲戚,要合成为亲戚
{
//防止一条直链的产生 ,比较x_root和y_root谁离祖先近,就把谁变成另一方的后代
if(length[x_root] > length[y_root])
{
parent[y_root] = x_root;
}
else if(length[x_root] < length[y_root])
{
parent[x_root] = y_root;
}
else
{
parent[x_root] = y_root;
length[y_root]++;
}
}
}
int main(void)
{
scanf("%d%d",&n,&m);
for(int i = 0;i <= n;i++)
{
parent[i] = -1;
length[i] = 0;
}
for(int i = 1;i <= m;i++)
{
int a,b;
scanf("%d%d",&a,&b);
union_root(a,b);
}
int x;
scanf("%d",&x);
while(x--)
{
int a,b;
scanf("%d%d",&a,&b);
if(find_root(a) == find_root(b))
{
printf("Yes\n");
}
else
{
printf("No\n");
}
}
return 0;
}
为什么用cin,cout 加上ios::sync_with_stdio(false) 也会 TLE
很棒,大佬,