#include<stdio.h>
#include <iostream>
using namespace std;
#define MAXSIZE 100
typedef struct node
{
int data;//结点对应编号
int rank;//结点对应秩
int parent;//结点对应双亲下标
}UFSTree;//并查集树的结点类型
void set(UFSTree t[],int n)//初始化并查集
{
int i;
for(i=1;i<=n;i++)
{
t[i].data=i;//初始为编号
t[i].rank=0;
t[i].parent=i;//双亲初始化指向自己
}
}
int find_set(UFSTree t[],int x)//查找一个元素所属集合
{
if(x!=t[x].parent)
t[x].parent=find_set(t,t[x].parent);
return t[x].parent;
}
void union_set(UFSTree t[],int x,int y)//两个元素各自所属集合的合并
{
x=find_set(t,x);y=find_set(t,y);//查找x,y在子集合中的位置
if(t[x].rank>t[y].rank)
t[y].parent=x;
else
t[x].parent=y;
if(t[x].rank=t[y].rank)
t[y].rank++;
}
int undirect(UFSTree t[],int x,int y)//判断无向图是否有环
{
if(find_set(t,x)==find_set(t,y))
return 1;
else
return 0;
}
int main()
{
int x,y;
int m=0;
int V,E;//v为顶点的个数,E为边的个数
UFSTree t[MAXSIZE];
printf("请输入顶点和边的个数\n");
scanf("%d %d",&V,&E);
printf("请输入顶点值\n");
for(int i=0;i<V;i++)
{
scanf("%d",&t[i].rank);
}
for(int i=0;i<E;i++)
{
printf("请输入边的两个顶点\n");
scanf("%d %d",&x,&y);
undirect(t,x,y);
printf("输入成功");
}
if(m==1)
printf("无向图有环\n");
else
printf("无向图没有环\n");
return 0;
}