欧拉路

一、基本概念:

欧拉路:欧拉路是指从图中任意一个点开始到图中任意一个点结束的路径,并且图中每条边通过的且只通过一次

欧拉回路:欧拉回路是指起点和终点相同的欧拉路。


二、存在欧拉路的条件:

1.无向连通图存在欧拉路的条件:

所有点度都是偶数,或者恰好有两个点度是奇数,则有欧拉路。若有奇数点度,则奇数点度点一定是欧拉路的起点和终点,否则可取任意一点作为起点。

2.有向连通图存在欧拉路的条件:

  • 每个点的入度等于出度,则存在欧拉回路(任意一点有度的点都可以作为起点)
  • 除两点外,所有入度等于出度。这两点中一点的出度比入度大,另一点的出度比入度小,则存在欧拉路。取出度大者为起点,入度大者为终点。

代码

#include <bits/stdc++.h>
#define M 1005
using namespace std;
int i,j,n,m,arr[M][M],numm,vis,ans[100000],sp,beginn=1,r;
void dfs(int k)
{
    for(int ii=1;ii<=n;ii++)
    {
        if(arr[k][ii]==1)
        {
            arr[k][ii]=0;
            arr[ii][k]=0;
            dfs(ii);    
        }
    }   
    ans[numm++]=k;
}
int main(){
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {   sp=0;
        for(j=1;j<=n;j++)
        {   
            cin>>arr[i][j];
            if(arr[i][j]==1)
            sp++;
        }
        if(sp%2==1&&r==0)
        beginn=i;
        if(sp%2==1)
        r++;
    }
   if(r==0||r==2)
{
    dfs(beginn);
    for(i=numm-1;i>=0;i--)
    {    if(i!=numm-1) cout<<" ";
          cout<<ans[i];
    }
}
 else cout<<"No Solution!";
}
View Code
原文地址:https://www.cnblogs.com/Lamboofhome/p/11841144.html