社区讨论
76pts求调
P5049[NOIP 2018 提高组] 旅行 加强版参与者 1已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mifzg67n
- 此快照首次捕获于
- 2025/11/26 20:30 3 个月前
- 此快照最后确认于
- 2025/11/26 21:18 3 个月前
CPP
#include<bits/stdc++.h>
using namespace std;
int n,m,head[500005],tot,d[500005],vis[500005],num,t,in[500005],fl;
queue<int> q;
struct sd{
int ne,to;
}edge[1000005];
void add(int x,int y){
edge[++tot].ne=head[x];
edge[tot].to=y;
head[x]=tot;
}
void dfs(int x,int fa){
// printf("%d\n",x);
d[++num]=x;
vis[x]=1;
vector<int> vec;
for(int i=head[x];i;i=edge[i].ne){
int y=edge[i].to;
if(in[y]!=1) t=y;
if(y==fa || in[y]!=1 || vis[y]) continue;
vec.push_back(y);
}
sort(vec.begin(),vec.end());
for(int i=0;i<vec.size();i++){
// if(vis[vec[i]]) continue;
dfs(vec[i],x);
}
}
void solve(int x,int fa,int mi){
// printf("%d\n",x);
d[++num]=x;
vis[x]=1;
vector<int> vec;
for(int i=head[x];i;i=edge[i].ne){
int y=edge[i].to;
if(y==fa || vis[y]) continue;
vec.push_back(y);
}
sort(vec.begin(),vec.end());
int flag=1e9,gg=0,cnt=0;
for(int i=vec.size()-1;i>=0;i--){
if(in[vec[i]]!=1){
flag=vec[i];
break;
}
}
if(x!=t){
if(flag!=1e9 && flag>mi && flag==vec[vec.size()-1] && !fl){
for(int i=0;i<vec.size();i++) if(in[vec[i]]==1) dfs(vec[i],x);
fl++;
return ;
}
}
for(int i=0;i<vec.size();i++){
if(vis[vec[i]]) continue;
if(in[vec[i]]!=1) solve(vec[i],x,((i+1<vec.size())?vec[i+1]:mi));
else dfs(vec[i],x);
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
int x,y;
scanf("%d%d",&x,&y);
add(x,y);
add(y,x);
in[x]++;
in[y]++;
}
for(int i=1;i<=n;i++) if(in[i]==1) q.push(i);
while(q.size()){
int x=q.front();
q.pop();
for(int i=head[x];i;i=edge[i].ne){
int y=edge[i].to;
if(in[y]==1) continue;
if(--in[y]==1) q.push(y);
}
}
if(in[1]==1) dfs(1,0);
else t=1;
// printf("%d ",t);
if(m==n) solve(t,0,1e9);
else if(!vis[1]) dfs(1,0);
for(int i=1;i<=num;i++) printf("%d ",d[i]);
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...