这题也太坑了,如果我现场打这题估计要挂掉,不过部分分还是很好拿的
其 实 本 题 记 住 一 个 原 则 , 考 虑 的 是 断 掉 的 那 条 边 , 这 样 讨 论 就 不 会 错 , 具 体 来 说 , 对 于 一 个 基 环 点 , 如 果 下 一 点 不 是 基 环 点 , 就 要 直 接 走 ( 参 见 图 一 ) , 而 影 响 当 前 是 否 走 基 环 点 的 只 有 上 一 个 有 环 的 基 环 点 ( 参 见 图 一 ) 其实本题记住一个原则,考虑的是断掉的那条边,这样讨论就不会错,具体来说,对于一个基环点,如果下一点不是基环点,就要直接走(参见图一),而影响当前是否走基环点的只有上一个有环的基环点(参见图一) 其实本题记住一个原则,考虑的是断掉的那条边,这样讨论就不会错,具体来说,对于一个基环点,如果下一点不是基环点,就要直接走(参见图一),而影响当前是否走基环点的只有上一个有环的基环点(参见图一)
如果走到3,下一个点是8就直接走,因为不走(断掉3,4)就再也走不了了
如果走到5,那么6一定比7先走
#include<bits/stdc++.h>
using namespace std;
const int N=5005;
int n,m,head[N],cnt=0;
struct edge{
int link,v;
}q[N<<1];
void put(int u,int v){
q[++cnt].v=v;
q[cnt].link=head[u];
head[u]=cnt;
}
struct node{
int id;
bool operator <(const node&x)const{
return x.id<id;
}
};
void dfs(int s,int fa){
priority_queue<node> myl;
for(int i=head[s];i;i=q[i].link){
int v=q[i].v;
if(fa==v) continue;
myl.push((node){v});
}
while(!myl.empty()){
node xx=myl.top();myl.pop();int x=xx.id;
printf("%d ",x);
dfs(x,s);
}
}
int sjh;
bool jh[N],vis[N],met=0,viss[N],cg=0;
void find_jh(int s,int fa){
vis[s]=1;
for(int i=head[s];i;i=q[i].link){
int v=q[i].v;
if(v==fa) continue;
if(vis[v]&&(!sjh)) {jh[s]=1;sjh=v;continue;}
else if(vis[v]) continue;
find_jh(v,s);
if(jh[v]&&s!=sjh&&(!met)) jh[s]|=jh[v];
else if(s==sjh){
jh[s]=1;
met=1;
}
}
}
int upd[N],fa[N];
struct node2{
int id,ff;
bool operator <(const node2 &x)const {
return x.id<id;
}
};
int tpp,tppf;
priority_queue<node2> myll;
void dfs3(int s,int fa){
priority_queue<node> myl;
viss[s]=1;
if(!jh[s]||cg)
{
for(int i=head[s];i;i=q[i].link){
int v=q[i].v;
if(v==fa) continue;
if(viss[v]) continue;
myl.push((node){v});
}
while(!myl.empty()){
node x=myl.top();
myl.pop();
int xx=x.id;
if(viss[xx]) continue;
printf("%d ",xx);
dfs3(xx,s);
}
}
else{
int tmp=tpp,tmp2=tppf;
for(int i=head[s];i;i=q[i].link){
int v=q[i].v;
if(v==fa) continue;
if(viss[v]) continue;
myl.push((node){v});
}
bool fff=0;
while(!myl.empty()){
node x=myl.top();
myl.pop();
int xx=x.id;
if(viss[xx]){continue;}
if(!jh[xx]||(cg)){printf("%d ",xx);dfs3(xx,s);continue;}
if(!fff) while(!myll.empty()) myll.pop();
if(!myl.empty()&&(!fff)){
fff=1;
node x2=myl.top();
int xx2=x2.id;
myll.push((node2){xx2,s});
tpp=xx2,tppf=s;
}
else if(!fff){
if(tpp)myll.push((node2){tpp,tppf});
}
int XX,F;
if(!myll.empty()){node2 X=myll.top();XX=X.id,F=X.ff;}
while((viss[XX]||XX==xx)&&(!myll.empty())){
myll.pop();
if(myll.empty()) break;
node2 X=myll.top();
XX=X.id,F=X.ff;
}
if(XX<xx&&(!cg)&&XX){
printf("%d ",XX);
myll.pop();
cg=1;
if(viss[XX]) {
myl.push((node){xx});
continue;
}
dfs3(XX,F);
return;
myl.push((node){xx});
}
else{
printf("%d ",xx);
dfs3(xx,s);
}
tpp=tmp;
tppf=tmp2;
}
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
int u,v;
scanf("%d%d",&u,&v);
put(u,v),put(v,u);
}
if(m==n-1){
printf("1 ");
dfs(1,0);
}
else{
find_jh(1,0);
viss[1]=1;
printf("1 ");
dfs3(1,0);
}
}