模板整理1 欧拉图的判定及输出路径(输出路径按字典序输出)

如何判断图是否有欧拉回路或者欧拉路径?

无向图:因为欧拉路径中,除了起点与终点以外,任意点的“进”“出”次数相等,所以除了两个点为奇点(度数为奇数的点)(终点和起点)以外,其它点的度数均为偶数。

如果是欧拉回路,奇点的个数应该为0。

有向图:欧拉路径中,最多只有两个点的入度不等于出度。起点出度比入度大1,终点入度比出度大1。

如果是欧拉回路,所有点的 入度=出度 。

如何输出路径:

必须保证是欧拉图

#include<bits/stdc++.h>
using namespace std;
const int N=1025;
multiset<int> to[N];
multiset<int> ::iterator pos;
int len[N];
int road[N],k;
void dfs(int x)
{
    for(pos=to[x].begin();pos!=to[x].end();pos=to[x].begin())
    {
        int u=*pos;
        to[x].erase(pos);
        to[u].erase(to[u].find(x));
        dfs(u);
    }
    road[k++]=x;
}

int main(){
    int m,a,b;
    scanf("%d",&m);
    for(int i=0;i<m;i++)
    {
        scanf("%d%d",&a,&b);
        len[a]++,len[b]++;
        to[a].insert(b);
        to[b].insert(a);
    }
    int s=-1,e=-1;
    for(int i=1;i<=1024;i++)
        if(len[i]%2==1)
        {
            if(s==-1)
            s=i;
            else if(e==-1)
            e=i;
            else
            exit(1);
        }
    if(s==-1)s=1;
    dfs(s);
    for(k=k-1;k>=0;k--)
        printf("%d\n",road[k]);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_36616023/article/details/81214208