图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 100007struct 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;
}