为什么这道题贪心不可以呢
#include<bits/stdc++.h>
using namespace std;
int n,m;
#define N 10005
#define M 300005
#define memset(Color,x,n) for(int i=1;i<=n;i++) Color[i]=x;
vector<int> E[N];
int Color[N],color=1,vis[N];
inline void adde(int u,int v){
E[v].push_back(u);
}
inline void GetColor(int u,int c){
if(E[u].size()==0) return;
vis[u]=1;Color[u]=c;
for(auto v:E[u]){
c^=1;
if(!vis[v])
GetColor(v,c^1);
}
}
vector<int> A,B;
int maxt,SizeA,SizeB,SizeO;
struct Ans{int u,v;};
vector<Ans> ans;
int vist[N];
inline void GetAnsA(){
for(auto u:A){
if(E[u].size()!=1) continue;
int v=E[u][0];
vist[u]=1;
if(!vist[v]) ans.push_back({min(u,v),max(u,v)});
if(E[v].size()) vist[v]=1;
}
}
inline void GetAnsB(){
for(auto u:B){
if(E[u].size()!=1) continue;
int v=E[u][0];
vist[u]=1;
if(!vist[v])
ans.push_back({min(u,v),max(u,v)});
if(E[v].size()) vist[v]=1;
}
}
inline bool cmp(Ans a,Ans b){
if(a.u==b.u) return a.v<b.v;
return a.u<b.u;
}
signed main() {
scanf("%d%d",&n,&m);int u,v;
if(m==0){printf("0\n");return 0;}
for(register int i=1;i<=m;i++){
scanf("%d%d",&u,&v);
adde(u,v);adde(v,u);
}memset(Color,-1,n);
for(register int i=1;i<=n;i++)
if(Color[i]==-1)
GetColor(i,1);
for(register int i=1;i<=n;i++){
if(Color[i]==1) A.push_back(i);
else if(Color[i]==0) B.push_back(i);
}
SizeA=A.size();
SizeB=B.size();
maxt=max(SizeA,SizeB);
if(SizeA>=maxt) GetAnsA();
if(SizeB>=maxt) GetAnsB();
printf("%d\n",ans.size());
sort(ans.begin(),ans.end(),cmp);
for(auto i:ans) printf("%d %d\n",i.u,i.v);
return 0;
}
P3731