无向图存在欧拉回路的充要条件:所有点的度数为偶数。(因为是回路,进了一个点还要出来:1 ↔ 2 ↔ 3,由1进2,再出2进3。奇数是出不来的。)
无向图存在欧拉路径的充要条件:奇数度数的点的个数为0或2。
有向图存在欧拉回路的充要条件:所有点的入度等于出度。
有向图存在欧拉路径的充要条件:一个点出度比入度大1(起点),一个点出度比入度小1(出度),其他点入度等于出度。
hihocoder1181
用fleury来求欧拉路
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=1005;
const int M=5005;
int n,m,head[N],to[2*M],nxt[2*M],du[N],num=1,S[M],top=0;
bool del[2*M];
void build(int u,int v)
{
num++;
to[num]=v;
nxt[num]=head[u];
head[u]=num;
}
void dfs(int u)
{
for(int i=head[u];i;i=nxt[i])
{
if(del[i]) continue;
del[i]=1; del[i^1]=1;
int v=to[i];
dfs(v);
}
S[++top]=u;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int u,v;
scanf("%d%d",&u,&v);
build(u,v);
build(v,u);
du[u]++; du[v]++;
}
int st;
for(int i=1;i<=n;i++)
if(du[i]) {st=i;break;}
dfs(st);
for(int i=top;i>=1;i--)
printf("%d ",S[i]);
}
这次的复习笔记有点草率啊……
有什么东西慢慢补吧