歐拉回路&歐拉通路複習筆記

無向圖存在歐拉回路的充要條件:所有點的度數爲偶數。(因爲是迴路,進了一個點還要出來: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]);
}

這次的複習筆記有點草率啊……
有什麼東西慢慢補吧

發佈了54 篇原創文章 · 獲贊 5 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章