社区讨论
80pts求助
P5022[NOIP 2018 提高组] 旅行参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mih88v4v
- 此快照首次捕获于
- 2025/11/27 17:24 3 个月前
- 此快照最后确认于
- 2025/11/28 20:05 3 个月前
wa on #20 #21 #23 #24 #26
CPP#include<bits/stdc++.h>
using namespace std;
int read(){
int x=0;
char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) x=x*10+(c-'0'),c=getchar();
return x;
}
int n,m,x,y,a[500005],top;
vector<int> v[500005];
void dfs1(int x,int fa){
a[++top]=x;
for(int i=0;i<v[x].size();i++){
if(v[x][i]==fa) continue;
dfs1(v[x][i],x);
}
}
bool flag[500005],f[500005];
int d[500005],lo[500005],s[500005],topp;
void dfs2(int x,int fa,int k){
s[++topp]=x,flag[x]=1,d[x]=lo[x]=k;
for(int i=0;i<v[x].size();i++){
if(v[x][i]==fa) continue;
if(flag[v[x][i]]){ lo[x]=min(lo[x],d[v[x][i]]);break; }
dfs2(v[x][i],x,k+1),lo[x]=min(lo[x],lo[v[x][i]]);
}
if(lo[x]==k){
bool flag1=0;
while(s[topp]!=x)
f[s[topp]]=1,topp--,flag1=1;
if(flag1) f[x]=1;
topp--;
}
}
bool fff;
void dfs3(int x,int k){
//cout<<x<<" "<<k<<"\n";
a[++top]=x,flag[x]=1;
for(int i=0;i<v[x].size();i++){
if(flag[v[x][i]]) continue;
if(f[v[x][i]]){
int j=i+1;
while(j<v[x].size()){
if(!flag[v[x][j]]) break;
j++;
}
if(j>=v[x].size()) j=k;
else j=v[x][j];
if(k==-2) dfs3(v[x][i],-1);
else if(k==-1) dfs3(v[x][i],j);
else if(i==v[x].size()-1&&v[x][i]>k&&!fff){ fff=1;continue; }
else dfs3(v[x][i],j);
}
else dfs3(v[x][i],k);
}
}
int main(){
n=read(),m=read();
for(int i=1;i<=m;i++){
x=read(),y=read();
v[x].push_back(y),v[y].push_back(x);
}
for(int i=1;i<=n;i++) sort(v[i].begin(),v[i].end());
if(m==n-1){
dfs1(1,0);
for(int i=1;i<=n;i++) printf("%d ",a[i]);
}
if(m==n){
dfs2(1,0,1);
for(int i=1;i<=n;i++) flag[i]=0;
//cout<<"---\n";
v[0].push_back(1);
dfs3(0,-2);
for(int i=2;i<=n+1;i++) printf("%d ",a[i]);
}
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...