#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=500010;
int n,m;
int Start[N<<1],End[N<<1],Last[N],Next[N<<1];
int visitime;
int dfn[N],son[N];
vector<int> G[N];
int ans[N],s[N];
int tot;
int ban1,ban2;
int st[N],tp,ed,last;
bool mark[N],vis[N],flag;
int read()
{
int x=0,f=1;char s=getchar();
while(s<'0'||s>'9'){if(s=='-')f=-f;s=getchar();}
while(s>='0'&&s<='9'){x=x*10+s-48;s=getchar();}
return x*f;
}
int cnt;
void add(int a,int b)
{
Start[++cnt]=a,End[cnt]=b,Next[cnt]=Last[a],Last[a]=cnt;
}
void getcircle(int x)
{
while(st[tp]!=ed)
{
mark[x]=1;
x=st[--tp];
}
mark[ed]=1;
}
void dfs(int x,int fa)
{
dfn[x]=++visitime;
st[++tp]=x;
for(int i=Last[x];i;i=Next[i])
{
if(End[i]!=fa&&dfn[End[i]])
{
if(flag) continue;
ed=End[i];
getcircle(x);
flag=1;
continue;
}
if(End[i]==fa) continue;
dfs(End[i],x);
}
tp--;
}
void dp(int x,int fa)
{
cout<<x<<" ";
vis[x]=1;
for(int i=0;i<G[x].size();i++)
{
int u=G[x][i];
if(u==fa||mark[u]&&vis[u]) continue;
if(mark[u]&&mark[x]&&!flag)
{
if((i==G[x].size()-1||i==G[x].size()-2&&vis[G[x][i+1]]))
{
if(last&&last<u)
{
flag=1;
return;
}
}
else last=G[x][i+1];
}
dp(u,x);
}
}
int main()
{
int a,b;
n=read(),m=read();
for(int i=1;i<=m;i++)
{
a=read(),b=read();
G[a].push_back(b);
G[b].push_back(a);
add(a,b);
add(b,a);
}
for(int i=1;i<=n;i++)
sort(G[i].begin(),G[i].end());
cout<<tot<<endl;//这里的tot会输出0
dfs(1,0);
cout<<tot<<endl;//这里会输出10
flag=0;
dp(1,0);
return 0;
}
如代码最后几排标注。问题就在于dfs函数里面根本就没有涉及到tot这个变量。为什么tot会变化呢?
数据
100 100
62 23
44 94
39 50
95 83
26 15
4 69
56 66
53 38
79 28
86 70
4 57
87 48
30 29
87 43
78 8
71 28
21 27
22 75
4 16
42 32
74 39
93 35
53 56
10 44
11 60
48 37
51 65
17 10
85 33
76 98
41 22
52 71
3 90
79 83
73 78
80 51
97 4
73 40
46 99
38 91
100 87
77 11
65 78
95 84
74 96
90 63
86 32
72 43
66 73
28 31
6 75
83 14
64 54
63 7
87 58
62 91
42 21
24 36
25 30
94 6
25 92
82 77
89 42
15 52
4 18
37 49
74 2
19 43
34 35
3 69
42 68
65 82
50 25
59 93
12 29
54 74
9 48
22 96
76 47
93 43
5 54
67 65
95 21
47 60
24 20
12 33
76 49
88 90
15 44
81 37
63 34
62 24
45 29
32 1
6 13
70 20
16 85
6 61
55 83
46 17