【模板】 欧拉路 欧拉回路

来源:互联网 发布:网络教育教学 编辑:程序博客网 时间:2024/06/02 23:15

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

如果给定无孤立结点图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;}
1 0