欧拉回路

本文深入探讨了欧拉回路算法的实现细节,通过Uoj117题目实例,展示了如何使用C++编程语言构建图结构,并实现欧拉回路的遍历。文章涵盖了图的构建、边的双向连接、顶点进出度数的判断以及欧拉路径的生成等关键步骤。

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

欧拉回路(Uoj117)

 

#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#define ll long long
using namespace std;
const int maxn=5000000+1010;

inline int read(){
    int x=0,f=1;char ch=getchar();
    for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-1;
    for(;isdigit(ch);ch=getchar())x=ch-'0'+(x<<3)+(x<<1);
    return x*f;
}

int n,m,t,in[maxn],out[maxn];
int tot=1,head[maxn],to[maxn],nx[maxn];
inline void add(int x,int y){
    to[++tot]=y;nx[tot]=head[x];head[x]=tot;
    return;    
}

int ans[maxn],num,stack[maxn],top,st[maxn];
bool book[maxn];
void euler(int u){
    stack[++top]=u;
    st[top]=0;
    while(top){
        int x=stack[top],y=st[top];
        int i=head[x];
        while(i && book[i])i=nx[i];
        if(i){
               stack[++top]=to[i];
               st[top]=i;
               head[x]=nx[i];
               if(t==1)book[i]=book[i^1]=1;
               else book[i]=1;
        }
        else {
            top--;
            ans[++num]=y;
        }
    }
    num--;
    return ;
}
int main(){
    t=read();n=read();m=read();
    for(int i=1;i<=m;i++){
        int x=read(),y=read();
        add(x,y);
        in[y]++;out[x]++;
        if(t==1)add(y,x); 
    }
    if(t==1){
        for(int i=1;i<=n;i++){
            if((in[i]+out[i])&1){printf("NO");return 0;} 
        }
    }
    else {
        for(int i=1;i<=n;i++){
            if(in[i]!=out[i]){printf("NO");return 0;} 
        }
    }
    for(int i=1;i<=n;i++){
        if(head[i]){
            euler(i);break;
        }
    }
    if(num!=m){printf("NO");return 0;}
    printf("YES\n");
    for(int i=m;i>=1;i--){
        if(t==1){
            if(ans[i]&1)printf("%d ",-ans[i]/2);
            else printf("%d ",ans[i]/2);    
        }
        else printf("%d ",ans[i]-1);
    }
    return 0;
}
View Code

 

转载于:https://www.cnblogs.com/wzq--boke/p/9720221.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值