无向图判断是否存在欧拉通路和欧拉回路

利用并查集

#include<bits/stdc++.h>
#define PI 3.1415926

using namespace std;

const int maxn = 1003;
int P,Q;   ///P为顶点数,Q为边数
int degree[maxn];  ///存放每个节点的度数
int father[maxn];  ///进行并查集操作的数组
void make_set()
{
    for(int i = 1; i <= P; i++)
    {
        father[i] = i;
    }
}
int find_set(int x)
{
    return father[x]==-1?x:father[x]=find_set(father[x]);
}
void union_set(int x,int y)
{
    father[x] = y;
}
bool IsConnection() ///判图是否连通
{
    int num = 0;
    for(int i = 1; i <= P; i++)
    {
        if(father[i]==-1)  ///自己所属集合是自己点只能有一个
            num++;
    }
    if(num == 1) return true;
    else return false;
}
int main()
{
    int N,A,B;
    cin>>N;
    while(N--)
    {
        memset(father,-1,sizeof(father));
        cin>>P>>Q;
        memset(degree,0,sizeof(degree));
        //make_set();  ///初始化并查集
        for(int i = 0; i < Q; i++)
        {
            scanf("%d%d",&A,&B);
            degree[A]++;
            degree[B]++;
            int fa = find_set(A);
            int fb = find_set(B);
            if(fa!=fb)
                union_set(fa,fb);
        }
        int num = 0;
        for(int i = 1; i <= P; i++)
        {
            if(degree[i]%2)  ///统计奇度节点的个数
                num++;
        }
        ///如果奇度节点的个数是0个或2个,且图是连通的则存在欧拉通路
        if((num==0||num==2)&&IsConnection())
            cout<<"Yes"<<endl;
        else
            cout<<"No"<<endl;
    }
//欧拉通路:图连通;图中只有2个度为奇数的节点(就是欧拉通路的2个端点)
//欧拉回路:图连通;图中所有节点度均为偶数
    return 0;
}

猜你喜欢

转载自blog.csdn.net/lanshan1111/article/details/83550687
今日推荐