欧拉回路判定与求解

图G是欧拉图,即存在欧拉回路的条件::smile:

1.图是联通的

2.对于无向图,奇度数点个数为0。对于有向图,每个顶点出度等于入度。

 

欧拉回路算法模板(链式前向星和DFS实现):

int ans[N];

int k = 0;

int vis[2*M];



void DFS(int now)

{

    for(int u=first[now];u!=-1;u=G[u].next)

    {

        if(!vis[u])

        {

            vis[u] = 1;    //标记当前边

            vis[u^1] = 1;  //标记反向的另一条边

            DFS(G[u].v);

            ans[k++] = k;

        }

    }

}

 

模板题 POJ 2230 Watchcow

把无向图看成有向图,求其欧拉回路。

#include <iostream>

#include <cstdio>

#include <cstring>

#include <cmath>

#include <algorithm>

using namespace std;

#define N 100007



struct Edge

{

    int v,next;

}G[N];

int n,m,tot;

int first[10005];

int vis[N];



void addedge(int u,int v)

{

    G[tot].v = v;

    G[tot].next = first[u];

    first[u] = tot++;

}



void DFS(int now)

{

    for(int u=first[now];u!=-1;u=G[u].next)

    {

        if(!vis[u])

        {

            vis[u] = 1;    //标记当前边

            DFS(G[u].v);

        }

    }

    printf("%d\n",now);

}



int main()

{

    int u,v;

    tot = 0;

    scanf("%d%d",&n,&m);

    memset(first,-1,sizeof(first));

    while(m--)

    {

        scanf("%d%d",&u,&v);

        addedge(u,v);

        addedge(v,u);

    }

    DFS(1);

    return 0;

}
View Code

 

你可能感兴趣的:(欧拉回路判定与求解)