【hihoCoder 1181】 : 欧拉路·二(Fleury算法)

这里写图片描述
这里写图片描述

这里学习了一个新算法,专门用来求解欧拉路的,回路和路径都可以。按照hihocoder给的思路,我给出了我的具体实现,时间复杂度 O(m) O ( m )

#include<iostream>
#include<cstdio>
#include<stack>
#include<algorithm>
#include<queue>
#include<cstring>
#include<cmath>
#include<vector>
#include<stack>
#define maxn 1005
#define maxx 5005
#define ll long long
#define INF 0x3f3f3f3f
using namespace std;
int n,m;
int head[maxn],_next[maxx<<1],to[maxx<<1];
bool vis[maxx<<1];
int edge=1;
void addEdge(int x,int y)
{
    to[++edge]=y,_next[edge]=head[x],head[x]=edge;
    to[++edge]=x,_next[edge]=head[y],head[y]=edge;
}
stack<int> st;
void dfs(int u)
{
    for(int i=head[u];i;i=_next[i])
    {
        if(vis[i])continue;
        vis[i]=vis[i^1]=true;
        st.push(to[i]);
        dfs(to[i]);
        break;
    }
}
void fleury(int r)
{
    st.push(r);
    while(st.size())
    {
        bool sign=true;
        int u=st.top();
        for(int i=head[u];i;i=_next[i])
        {
            if(vis[i])continue;
            sign=false;
            vis[i]=vis[i^1]=true;

            st.push(to[i]);
            dfs(to[i]);
            break;
        }
        if(sign)
        {
            if(st.size()==1)
                printf("%d",st.top());
            else printf("%d ",st.top());
            st.pop();
        }
    }
}
int deg[maxn];
int main()
{
    cin>>n>>m;
    int x,y;
    for(int i=0;i<m;++i)
    {
        scanf("%d%d",&x,&y);
        addEdge(x,y);
        ++deg[x],++deg[y];
    }
    bool sign=false;
    int r;
    for(int i=1;i<=n;i++)
        if(deg[i]&1)
        {
            r=i;
            sign=true;
            break;
        }
    if(sign)fleury(r);
    else fleury(1);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值