利用並查集進行圖中兩頂點是否連通的判斷
阿新 • • 發佈:2019-02-07
//利用並查集判斷無向圖中兩節點是否連通
#include <iostream>
#include<cstdio>
using namespace std;
const int maxn=100+5;
int vset[maxn];
int rank[maxn]; //樹的高度
int Getparent(int i) //路徑壓縮
{
if(i!=vset[i])
vset[i]=Getparent(vset[i]);
return vset[i];
}
void unite(int x,int y) /*防止樹的退化*/
{
int p1=Getparent(x);
int p2=Getparent(y);
if(p1==p2) return;
if(rank[x]<rank[y]) vset[x]=y;
else {
if(rank[x]==rank[y]) rank[x]++;
vset[y]=x;
}
}
int main()
{
int v,e; //v為頂點數,e為邊數
scanf("%d%d",&v,&e);
for(int i=1;i<=v;i++)
{
vset[i]=i;
rank[i]=1;
}
for(int i=0;i<e;i++)
{
int v1,v2;
scanf("%d%d",&v1,&v2);
unite(v1,v2);
}
int v1,v2;
while(scanf("%d%d",&v1,&v2)==2)
{
if(v1<1||v1>v||v2<1||v2>v) printf("can not find\n");
else {
int p1=Getparent(v1);
int p2=Getparent(v2);
if(p1==p2) printf("Yes\n");
else printf("No\n");
}
}
return 0;
}
#include <iostream>
#include<cstdio>
using namespace std;
const int maxn=100+5;
int vset[maxn];
int rank[maxn]; //樹的高度
int Getparent(int i) //路徑壓縮
{
if(i!=vset[i])
vset[i]=Getparent(vset[i]);
return vset[i];
}
void unite(int x,int y) /*防止樹的退化*/
{
int p1=Getparent(x);
int p2=Getparent(y);
if(p1==p2) return;
if(rank[x]<rank[y]) vset[x]=y;
else {
if(rank[x]==rank[y]) rank[x]++;
vset[y]=x;
}
}
int main()
{
int v,e; //v為頂點數,e為邊數
scanf("%d%d",&v,&e);
for(int i=1;i<=v;i++)
{
vset[i]=i;
rank[i]=1;
}
for(int i=0;i<e;i++)
{
int v1,v2;
scanf("%d%d",&v1,&v2);
unite(v1,v2);
}
int v1,v2;
while(scanf("%d%d",&v1,&v2)==2)
{
if(v1<1||v1>v||v2<1||v2>v) printf("can not find\n");
else {
int p1=Getparent(v1);
int p2=Getparent(v2);
if(p1==p2) printf("Yes\n");
else printf("No\n");
}
}
return 0;
}