传送门
按照题目说的做是不会挂掉的,但是会TLE+MLE掉的。
考虑用链表进行优化。我们删掉一个元素,之后就再也比用访问了。
如果当前边不存在就枚举下一个节点。(二分)
可以证明上面情况最多出现O(N)次。
时间复杂度O(NlogN)
#include<cmath>
#include<cstdio>
#include<vector>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 100005
using namespace std;
int n,m,x,y,nx[N],pr[N];
vector<int> g[N];
void dfs(int x){
printf("%d\n",x);
sort(g[x].begin(),g[x].end());
nx[pr[x]]=nx[x]; pr[nx[x]]=pr[x];
for (int i=nx[0];i<=n;i=nx[i])
if (i!=g[x][lower_bound(g[x].begin(),g[x].end(),i)-g[x].begin()]){
dfs(i); return;
}
}
int main(){
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++)
nx[i]=i+1,pr[i]=i-1,g[i].push_back(1e9);
nx[0]=1; pr[1]=0;
for (int i=1;i<=m;i++){
scanf("%d%d",&x,&y);
g[x].push_back(y);
g[y].push_back(x);
}
dfs(1);
}