#include<bits/stdc++.h>
#define int long long
#define N 300005
using namespace std;
inline void print(int n){if(n<0){putchar('-');print(-n);return;}if(n>9)print(n/10);putchar(n%10+'0');}
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*f;}
struct node{
int to,dis;
};
int n,m,x[N],y[N];
int fa[N],tot,siz[N],rt;
vector<int>p;
vector<node>a[N];
int find(int x){
if(fa[x]==x)return x;
return fa[x]=find(fa[x]);
}
void dfs(int now,int fa){
if(tot>=p.size())return;
if(siz[now]==1&&now!=rt&&now!=0){
while(tot<p.size()){
if(p[tot]==rt){
tot++;
continue;
}
// a[now].push_back(node{p[tot],0});
a[fa].push_back(node{p[tot],0});
a[p[tot]].push_back(node{fa,0});
a[p[tot]].push_back(node{now,0});
for(int i=0;i<a[now].size();i++){
if(a[now][i].to==fa)a[now][i].dis=1;
}
for(int i=0;i<a[fa].size();i++){
if(a[fa][i].to==now)a[fa][i].dis=1;
}
fa=p[tot];
siz[p[tot]]+=2;
tot++;
}
return;
}
for(auto i:a[now]){
if(i.to==fa||i.dis||i.to==0||now==0)continue;
dfs(i.to,now);
if(tot>=p.size())return;
}
}
void print(int now,int fa){
for(auto i:a[now]){
if(i.to==fa||i.dis||i.to==0||now==0)continue;
print(now);putchar(' ');print(i.to);putchar('\n');
print(i.to,now);
}
}
signed main(){
n=read();m=read();
for(int i=1;i<=n;i++)fa[i]=i;
for(int i=1;i<=m;i++){
x[i]=read();y[i]=read();
a[x[i]].push_back(node{y[i],0});
a[y[i]].push_back(node{x[i],0});
if(find(x[i])==find(y[i])){
puts("No");
return 0;
}
fa[find(x[i])]=find(y[i]);
}
puts("Yes");
for(int i=1;i<=n;i++){
if(fa[i]==i)p.push_back(i);
}
for(int i=1;i<=n;i++)siz[i]=a[i].size();
for(int i:p){
if(a[i].size()){
rt=i;
dfs(i,0);
print(i,0);
return 0;
}
}
return 0;
}
可以不管代码思路,就是看看为啥会加上注释那句就会T。。。
思路很抽象。。。