欧拉图

如果图 \(G\) 中的一个路径包括每个边恰好一次,则该路径称为欧拉路径。该路径是通路,则称为欧拉通路,是回路,则称为欧拉回路。

无向图

有零个或两个奇数度的点,则存在欧拉通路。每个点的度数都是偶数,则存在欧拉回路。

有向图

有一个点出度比入度大 \(1\),有一个点入度比出度大 \(1\),除这两点外,其余点每个点的出度和入度相等或每个点的出度和入度相等,则存在欧拉通路。

每个点的出度和入度相等,则存在欧拉回路。

求解

可以通过建反图跑 \(dfs\) 来找欧拉回路方案,需要弧优化。第一个是无向图,第二个是有向图。

void dfs1(int x)
{
    for(int &i=head[x];i;i=e[i].nxt)
    {
        if(vis[i]) continue;
        int l=i;
        vis[i]=vis[i^1]=true,dfs1(e[i].to),p[++cnt]=l&1?-(l>>1):(l>>1);
    }
}
void dfs2(int x)
{
    for(int &i=head[x];i;i=e[i].nxt)
    {
        if(vis[i]) continue;
        int l=i;
        vis[i]=true,dfs2(e[i].to),p[++cnt]=l;
    }
}
posted @ 2020-04-04 20:10  lhm_liu  阅读(439)  评论(0编辑  收藏  举报