欧拉回路&欧拉通路复习笔记

无向图存在欧拉回路的充要条件:所有点的度数为偶数。(因为是回路,进了一个点还要出来:1 ↔ 2 ↔ 3,由1进2,再出2进3。奇数是出不来的。)
无向图存在欧拉路径的充要条件:奇数度数的点的个数为0或2。

有向图存在欧拉回路的充要条件:所有点的入度等于出度。
有向图存在欧拉路径的充要条件:一个点出度比入度大1(起点),一个点出度比入度小1(出度),其他点入度等于出度。

hihocoder1181
用fleury来求欧拉路

#include
#include
#include
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]);
}

这次的复习笔记有点草率啊……
有什么东西慢慢补吧

你可能感兴趣的:(-------图论------,欧拉路)