【模板】 欧拉路 欧拉回路

19 篇文章 0 订阅
12 篇文章 0 订阅

啥是欧拉路(欧拉回路)??

如果给定无孤立结点图G,若存在一条路,经过图中每边一次且仅一次,这条路称为欧拉路;
如果给定无孤立结点图G,若存在一条回路,经过图中每边一次且仅一次,那么该回路称为欧拉回路。
存在欧拉回路的图,称为欧拉图。

欧拉路(欧拉回路)有啥用??

一笔画问题 即寻找欧拉路或欧拉回路
裸的模板题 骑马修栅栏,很裸很裸很裸

欧拉路(欧拉回路)怎么写??

如果寻找欧拉回路,对任意一个点进行dfs,寻找欧拉路,则对一个度为 1 的点进行dfs,时间复杂度为O(m+n),m为边数,n为点数

#include <bits/stdc++.h>
using namespace std;
int n,m,pic[1100][1100],d[1100],road[1500],now;
void dfs(int x)
{
    for(int i=1;i<=500;i++)
        if(pic[x][i])
        {
            pic[x][i]--;             //注意可能有重边
            pic[i][x]--;
            dfs(i);
        }
    road[++now]=x;             //记录路径
}
int main()
{
    cin>>m;
    for(int i=1;i<=m;i++)
    {
        int x,y;
        cin>>x>>y;
        pic[x][y]++;
        pic[y][x]++;
        d[x]++;
        d[y]++;
    }
    int st=1;                          //如果无度为1的点,则从任意点开始搜,即寻找欧拉回路
    for(int i=1;i<=500;i++)            //如果有度为1的点,则从该点开始搜,即寻找欧拉路
        if(d[i]%2)
        {
            st=i;
            break;
        }
    dfs(st);
    for(int i=now;i>=1;i--)
    {
        cout<<road[i]<<endl;
    }
    return 0;
}
  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值