KingKrush @ 2018-08-08 19:34:01
#include <bits/stdc++.h>
using namespace std;
int pre[10005];
int a[100000] ;
int find(int x)
{
int r=x;
while(pre[r]!=r)
r=pre[r];
int i=x,j;
while(i!=r)
{
j=pre[i];
pre[i]=r;
i=j;
}
return r;
}
void join(int x,int y)
{
int a=find(x);//x的根节点为a
int b=find(y);//y的根节点为b
if(a!=b)//如果a,b不是相同的根节点,则说明ab不是连通的
{
pre[a]=b;
}
}
int pan(int x,int y)
{
int a=find(x);
int b=find(y);
if(a==b)
return 1;
else if(a!=b)
return 2;
}
int main()
{
int n,m,x,y,z,bo=1;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
pre[i]=i;
for(int g=1;g<=m;g++)
{
scanf("%d%d%d",&z,&x,&y);
if(z==1)
join(x,y);
if(z==2)
{
a[bo]=pan(x,y);
bo++;
}
}
for(int x=1;x<=n+1;x++)
{
if(a[x]==1)
printf("%c\n",89);
else if(a[x]==2)
printf("%c\n",78);
}
return 0;
}
有一点绝望
by 二中胡剑锋 @ 2018-08-12 12:00:39
在你的基础上修改的,注释掉一些内容
using namespace std; int pre[10005]; int a[100000] ; int find(int x) { // int r=x; // while(pre[r]!=r) // r=pre[r]; // int i=x,j; // while(i!=r) { // j=pre[i]; // pre[i]=r; // i=j; // } // return r; if(pre[x]==x) return x; return pre[x]=find(pre[x]);//压缩路径 }
void join(int x,int y) { int a=find(x);//x的根节点为a int b=find(y);//y的根节点为b if(a!=b) { //如果a,b不是相同的根节点,则说明ab不是连通的 pre[a]=b; } return; } //int 空函数无返回值 void pan(int x,int y) { //判断是否为“亲戚” int a=find(x); int b=find(y); if(a==b) printf("Y\n"); else printf("N\n");//直接输出 } int main() { int n,m,x,y,z; scanf("%d%d",&n,&m); for(int i=1; i<=n; i++) pre[i]=i;//初始化 for (int i=1; i<=m; i++) { scanf("%d %d %d",&z,&x,&y); if (z==1) join(x,y);//可以直接调用函数 else pan(x,y); } return 0; }