UVA 10054 The Necklace(欧拉回路)

本文介绍了一种基于深度优先搜索(DFS)的欧拉回路寻找算法,并通过实例演示了如何确保即使在存在小环的情况下也能正确输出欧拉回路。文章详细解释了逆序输出节点对以保证回路首尾相连的必要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

输出不能顺序输出,如果环中还有一个小环,那么dfs的时候就会回溯,那样的话顺序输出就会错误,但是逆序输出就能保证首位相接。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<stack>
using namespace std;
const int maxc=50+5;
int degree[maxc],vis[maxc][maxc];
#define ss(x) scanf("%d",&x)
#define rep(i,a,b) for(int i=(a);i<(b);i++)
int n;
vector<pair<int,int> > ans;
void euler(int u)
{
    for(int v=1;v<=50;v++) if(vis[u][v]){
        vis[u][v]--;vis[v][u]--;
        euler(v);
        ans.push_back(make_pair(u,v));
    }
}
int main()
{
    int kase=0;
    int t;ss(t);
    while(t--)
    {
        memset(degree,0,sizeof(degree));
        memset(vis,0,sizeof(vis));
        ans.clear();
        ss(n);
        int u=0,v=0;
        rep(i,0,n){
            scanf("%d%d",&u,&v);
            degree[u]++;degree[v]++;
            vis[u][v]++;vis[v][u]++;
        }
        bool ok=true;
        for(int i=1;i<=n;i++) if(degree[i]%2==1) {ok=false;break;}
        if(kase) printf("\n");
        printf("Case #%d\n",++kase);
        if(ok) {euler(u);if(ans.size()!=n) ok=false;}
        if(ok==false) printf("some beads may be lost\n");
        else for(int i=n-1;i>=0;i--) printf("%d %d\n",ans[i].first,ans[i].second);
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值