無向圖存在歐拉回路的充要條件:所有點的度數爲偶數。(因爲是迴路,進了一個點還要出來: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]);
}
這次的複習筆記有點草率啊……
有什麼東西慢慢補吧