御·Dragon @ 2018-07-22 10:21:39
桃 @萝莉大法好 @AThousandSuns
改了一下,再次求助
#include<bits/stdc++.h>
using namespace std;
const int MAXN=20010;
int s[MAXN];
int n,m,z,x,y,k;
int fin(int p){
if(s[p]==0)return p;
fin(s[p]);
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
scanf("%d",&z);
scanf("%d %d",&x,&y);
switch(z){
case 1:{
s[y]=x;
break;
}
case 2:{
if(fin(y)==fin(x))printf("Y\n");
else printf("N\n");
}
}
}
return 0;
}
//样例过了,但10分
by UKE自动稽 @ 2018-07-22 10:34:50
我好像节选错了,
by 御·Dragon @ 2018-07-22 10:35:57
@UKE自动机 666,你和我教练的标程中的是一样的。但他的是findF
by Altria_Pendragon_ @ 2018-07-22 10:37:20
@封禁用户名f8617dda
1.集合的初始状态father[x]=x;
2.您的路径压缩呢?
by 御·Dragon @ 2018-07-22 18:17:26
@Rousseau_ @CONILLION @UKE自动机
现在谢谢,各位大佬,本人已经AC,然而程序的经历如下:
#include<bits/stdc++.h>//万能头
using namespace std;
const int MAXN=200010;
int s[MAXN];
int n,m,z,x,y,k;
int fin(int p){
if(s[p] == p) {
return p;//若果相同的话就是根,返回
}
fin (s[p]);
s[p]=fin (s[p]); //要一边返回一边路径压缩。
return fin (s[p]);
}
int main(){
cin>> n>> m; //输入
for(int i = 1;i <= m;i ++){
s[i] = i;//如果这里不加的话前面fin的第一的判断 if(s[p] == 0)
}
for(int i = 1;i <= m;i ++){
/*要边输入边执行*/
scanf("%d", &z);
scanf("%d %d", &x, &y);
switch (z){//最好用开关语句,更快
case 1:{
s[fin(y)] = fin(x);//千万不能 s[y] =x!!!!!切记!千万不能!
break;
}
case 2:{
if(fin(y) == fin(x)){//不可以y==k,上面已经讲了。
printf("Y\n");
}else{
printf("N\n");
}
}
}
}
return 0;
}