2070 欧拉回路--[中等+]

描述

输入一个无向连通图,判断这个图是否存在欧拉回路,如果没有则输出“no oula circle”,如果有,输出以结点1开始的一条欧拉回路,回路上结点序号优先小的。

输入描述

第一行一个整数 n 和 m,表示这个图有 n 个结点、m 条边,接下来 m 行,每行两个整数 ai​ 和 aj​,表示结点 ai​ 和 aj​之间有一条边。

输出描述

如果不存在欧拉回路,请输出“no oula circle”,如果有欧拉回路,请输出结点 1 开始的欧拉回路的结点编号。

#include <iostream>

using namespace std;
//arr记录邻接矩阵 dot记录奇点(每个点连接边数量) ans数组存储结果 
int arr[105][105],dot[105],n,m,ans[105];
//记录奇点
int start[3], sum=0;
 
//x正在到达的结点 cnt是数组ans的下标
void dfs(int x,int cnt){
    //边界条件:1.找到了奇点1/奇点2 2.欧拉回路:所有路径都走过一次 
    if((x==start[1]||x==start[2])&&sum==m){
        //输出
        for(int i=1; i<cnt; i++)     
            cout<<ans[i]<<" ";
        exit(0);
    } 
    //非边界条件:循环看一看哪些点没有走还可以走
    for(int i=1;i<=n;i++){
        //联通
        if(arr[x][i]==1){
            //1.记录当前点
            ans[cnt]=i;
            //2.删除走过的边
            arr[i][x]=arr[x][i]=0;
            //3.计数
            sum++;
            //递归
            dfs(i, cnt+1);
            //回溯:删除的边还原,计数的数删除 
            arr[i][x]=arr[x][i]=1;
            sum--;
        } 
    } 
}

int main(){
    //1.输入
    cin>>n>>m;
    //2.构建无向图邻接矩阵
    for(int i=1;i<=m;i++){
        int a,b;
        cin>>a>>b;
        dot[a]++, dot[b]++;
        arr[a][b]=arr[b][a]=1;
    }
    //统计
    int k=0; 
    start[1]=1;
    //3.记录每个结点连接边数量
    for(int i=1;i<=n;i++){
        if(dot[i]%2==1){
            k++;
            start[k]=i;
        }
    }
    //4.判断:1.奇点为0 2.奇点为2并且1是奇点    //搜索
    if(k==0 || k==2&&start[1]==1){
        ans[1] = start[1];
        dfs(start[1], 2); 
    }else{
        cout << "no oula circle";
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值