随笔 - 531  文章 - 0  评论 - 3  阅读 - 10215 

 

求欧拉回路( dfs )

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include <bits/stdc++.h>
using namespace std ;
 const int N=1e6+3,M=2e6+3;
  
  
  
 inline int read(){
    int res = 0, flag = 1;
    char ch = getchar();
    while (ch < '0' || ch > '9')
    {
        if (ch == '-')
            flag = -1;
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9')
    {
        res = res * 10 + ch - '0';
        ch = getchar();
    }
    return res * flag;
}
 int n,m;
 // op==1 有向图 op==2 无向图
  
 vector<int> ans;
 int deg[N],in[N],out[N];
  
 int nxt[M],go[M],hd[N],all;
 int op;
 int vis[N];
 void add_(int x,int y){
    nxt[++all]=hd[x]; hd[x]=all;
    go[all]=y;
 }
  
 void dfs(int x){
    for(int &i=hd[x];i;i=nxt[i]){
        int y=go[i];
        int k=i;
         
        if(op==1){
            int e=(i+1)/2;
            if(vis[e]==0){
                vis[e]=1;
                dfs(y);
                 
                if(k&1) ans.push_back(e);
                else ans.push_back(-e);
            }
        }
        else{
            if(vis[k]==0){
                vis[k]=1;
                dfs(y);
                ans.push_back(k);
                 
            }
        }
    }
 }
 signed main(){
    int i,x,y;
    scanf("%d%d%d",&op,&n,&m);
     
    for(i=1;i<=m;i++){
        x=read(),y=read();
         
        if(op==1){
            add_(x,y),add_(y,x);
            deg[x]++,deg[y]++;
        }
        else{
            add_(x,y);
            out[x]++,in[y]++;
        }
    }
    if(op==1){
        for(i=1;i<=n;i++)
            if(deg[i]&1){ printf("NO\n"); return 0; }
    }
    else{
        for(i=1;i<=n;i++){
            if(in[i]!=out[i]){ printf("NO\n"); return 0; }
        }
    }
     
    for(i=1;i<=n;i++){
        if(hd[i]){ dfs(i); break; }
    }
      
    if(ans.size()==m){
        cout<<"YES"<<endl;
        for(i=ans.size()-1;i>=0;i--)  printf("%d ",ans[i]);
    }
    else{
        cout<<"NO\n";
    }  
     
 }

 

posted on   towboat  阅读(95)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示