欧拉回路

欧拉问题俗称一笔画问题。
给定一张无向图,若存在一条从节点S到节点T的路径,恰好不重不漏的经过每一条边(可以重复经过一个点),则称该路径为S到T的欧拉路
若存在一条从节点S出发的路径,恰好不重不漏的经过每条边一次(可以重复经过一个点),最终回到起点S,则称该路径为欧拉回路,存在欧拉回路的无向图=称为欧拉图。
欧拉图判定: 当且仅当无向图连通且每个点的度数都是偶数
欧拉路判定:当且仅当无向图连通并且图中恰好有两个点的度数是奇数,其他节点的度数都是偶数,这两个奇数节点就是欧拉路的起点和终点。
求欧拉回路:(模拟栈实现)

#include<bits/stdc++.h>
using namespace std;
int ver[100010],head[100010],Next[100010],stak[100010],tot;
int ans[100010],v[100010],k=0,top=0;
void add(int x,int y)
{
    ver[++tot]=y;
    Next[tot]=head[x];
    head[x]=tot;
}
void oula()
{
    stak[++top]=1;
    while(top>0)
    {
        int x=stak[top];
        int i=head[x];
        while(i&&v[i])i=Next[i];
        if(i)
        {
            stak[++top]=ver[i];
            v[i]=v[i^1]=1;
            head[x]=Next[i];
        }
        else
        {
            top--;
            ans[++k]=x;
        }
    }
}
int main()
{
    int n,m;
    cin>>n>>m;
    tot=1;
    for(int i=0;i<m;i++)
    {
        int x,y;
        cin>>x>>y;
        add(x,y);
        add(y,x);
    }
    memset(v,0,sizeof(v));
    oula();
    for(int i=k;i;i--)
    {
        cout<<ans[i]<<endl;
    }
}
/*
7 9
1 2
1 3
2 3
1 4
1 5
4 5
5 6
5 7
6 7
*/
发布了264 篇原创文章 · 获赞 14 · 访问量 7802
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览