JSK-习题:判断欧拉回路-欧拉图

这里写图片描述

思路:

使用无向图找欧拉图模板判断联通性,再由欧拉图的性质,即可判断

欧拉图性质:

无向图:联通+所有点的度数为偶数
无向图:联通+所有点的入度数=出度数

代码:

#include <iostream>
#include <string.h>
using namespace std;
const int MAX_N=100000;
struct edge
{
     int to,next;
}e[2*MAX_N];
int eid,p[MAX_N];
int ans[MAX_N];
int ansi=0;
bool vst[2*MAX_N];
int degree[MAX_N];
void init()
{
     eid=0;
     memset(p,-1,sizeof(p));
     memset(vst,false,sizeof(vst));
     memset(degree,0,sizeof(degree));
}
void insert(int u,int v)
{
     e[eid].to=v;
     e[eid].next=p[u];
     p[u]=eid++;
}
void dfs(int now)
{
     int k;
     for(k=p[now];k!=-1;k=e[k].next)
     {
         if(!vst[k])
         {
             vst[k]=true;
             vst[k^1]=true;
             dfs(e[k].to);
             ans[ansi++]=k;
         }
     }
}
int main()
{
     int n,m;
     init();
     cin>>n>>m;
     for(int i=0;i<m;i++)
     {
         int a,b;
         cin>>a>>b;
         insert(a,b);
         insert(b,a);
         degree[a]++;
         degree[b]++;
     }
     int flag=1;
     for(int i=1;i<=n;i++)
     {
         if(degree[i]%2)
         {
             flag=0;
             break;
         }
     }
     dfs(1);
     for(int i=1;i<=n;i++)
     {
         if(!vst[i])
         {
             flag=0;
             break;
         }
     }
     if(flag)
        cout<<1<<endl;
     else
        cout<<0<<endl;
}

猜你喜欢

转载自blog.csdn.net/weixin_43093481/article/details/82262840
今日推荐