欧拉图
如果图 \(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;
}
}

浙公网安备 33010602011771号