欧拉回路(dfs 。。。。。等会补fleury算法:)


若图G中存在这样一条路径,使得它恰通过G中每条边一次,则称该路径为 欧拉路径。若该路径是一个圈,则称为 欧拉(Euler)回路
具有欧拉回路的图称为 欧拉图(简称E图)。具有欧拉路径但不具有欧拉回路的图称为半欧拉图


以下判断基于此图的基图连通。
无向图存在欧拉回路的充要条件
一个无向图存在欧拉回路,当且仅当该图所有顶点度数都为偶数,且该图是连通图。
有向图存在欧拉回路的充要条件
一个有向图存在欧拉回路,所有顶点的入度等于出度且该图是连通图。
混合图存在欧拉回路条件
要判断一个混合图G(V,E)(既有有向边又有无向边)是欧拉图,方法如下:
假设有一张图有向图G',在不论方向的情况下它与G同构。并且G'包含了G的所有有向边。那么如果存在一个图G'使得G'存在欧拉回路,那么G就存在欧拉回路。
其思路就将混合图转换成有向图判断。实现的时候,我们使用 网络流的模型。现任意构造一个G'。用Ii表示第i个点的入度,Oi表示第i个点的出度。如果存在一个点k,|Ok-Ik|mod 2=1,那么G不存在欧拉回路。接下来则对于所有Ii>Oi的点从 源点连到i一条容量为(Ii-Oi)/2的边,对于所有Ii

紫书上的 模板

#include 
#include
#include
#include
#include
using namespace std;
const int maxn=5000+5;
int ege[maxn][maxn];
int vis[maxn][maxn];
int n;
void ola(int index)
{
    for(int i=1;i<=n;i++)
    {
        if(!vis[index][i]&&ege[index][i])
        {
            vis[index][i]=1;
            vis[i][index]=1;
            ola(i);
            printf("%d--%d\n",index,i);
        }

    }

}

int main()
{
    int x,y;
    int nn;
    cin>>n>>nn;
    memset(ege,0,sizeof(ege));
    memset(vis,0,sizeof(vis));

    for(int i=0;i>x>>y;
        ege[x][y]=1;
        ege[y][x]=1;

    }

    ola(1);

   // cout << "Hello world!" << endl;
    return 0;
}


一个博客点击打开链接


举个栗子

poj2230

#include 
#include
#include
#include
using namespace std;
const int maxn=50000+5;
vector ege[maxn];
void ola(int index)
{
    for(int i=0;i>n>>nn;
    for(int i=0;i>x>>y;
        ege[x].push_back(y);
        ege[y].push_back(x);
        if(x>n)
            n=x;
        if(y>n)
            n=y;
    }

    ola(1);
    return 0;
}

关于欧拉回路的

点击打开链接

fleury算法例题:

下次再搞:


。。。。阳哥在操场上等着我。。。无奈等会再敲了


今天晚上是WF正式赛!!!!!!!

但是我不看吧,我要早睡觉,十二点前睡觉!


你可能感兴趣的:(算法,待补题)