社区讨论
一个关于dfs输出方式的问题
P7771【模板】欧拉路径参与者 3已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @mewfkkew
- 此快照首次捕获于
- 2025/08/29 14:07 6 个月前
- 此快照最后确认于
- 2025/11/03 23:44 4 个月前
为什么在进入dfs时输出当时节点只有20分
CPP#include <bits/stdc++.h>
using namespace std;
int n,m,in[100005],out[100005],sta,cnt,nw[100005];
vector<int>v[100005];
void dfs(int s){
cout << s << " ";//直接输出
for(int i = nw[s];i < v[s].size();i = nw[s]){
nw[s]++;
int son = v[s][i];
dfs(son);
}
}
signed main() {
cin >> n >> m;
for(int i = 1;i <= m;i++){
int a,b;
cin >> a >> b;
v[a].push_back(b);
out[a]++;
in[b]++;
}
for(int i = n;i >= 1;i--){
sort(v[i].begin(),v[i].end());
if(out[i] - in[i] == 1){
sta = i,cnt++;
}else if(in[i] - out[i] == 1){
cnt++;
}else if(in[i] == out[i]){
continue;
}else{
cout << "No" << endl;
return 0;
}
}
if(cnt > 2){
cout << "No" << endl;
return 0;
}
dfs(sta);
return 0;
}
而在最后存储到stack,从dfs出来后输出才对
CPP#include <bits/stdc++.h>
using namespace std;
stack<int>ans;
int n,m,in[100005],out[100005],sta = 1,cnt,nw[100005];
vector<int>v[100005];
void dfs(int s){
for(int i = nw[s];i < v[s].size();i = nw[s]){
nw[s]++;
int son = v[s][i];
dfs(son);
}
ans.push(s);//最后存储
}
signed main() {
cin >> n >> m;
for(int i = 1;i <= m;i++){
int a,b;
cin >> a >> b;
v[a].push_back(b);
out[a]++;
in[b]++;
}
for(int i = 1;i <= n;i++){
sort(v[i].begin(),v[i].end());
if(out[i] - in[i] == 1){
sta = i,cnt++;
}else if(in[i] - out[i] == 1){
cnt++;
}else if(in[i] == out[i]){
continue;
}else{
cout << "No" << endl;
return 0;
}
}
if(cnt > 2){
cout << "No" << endl;
return 0;
}
dfs(sta);
while(!ans.empty()){//stack输出
cout << ans.top() << " ";
ans.pop();
}
return 0;
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...