#include <bits/stdc++.h>
using namespace std;
const int N=2e5+5;
struct vv{
int from,to;
};
int vis[N];//不能走到重复点.
vector<int>v[N];
vector<vv>ans;
int deg[N];//度
queue<int>q;
void bfs()
{
while(q.size())
{
int temp=q.front();
vis[temp]=1;
q.pop();
for(int i=0;i<v[temp].size();i++)
{
int x=v[temp][i];
if(vis[x]) continue;
vis[x]=1;
ans.push_back({temp,x});
q.push(x);
}
}
}
int main()
{
int n,m,mx1=0,mx2=0;//mx1记录最大度数 mx2记录最大度数所在的点.
scanf("%d%d",&n,&m);//点数 边数
for(int i=0;i<m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
v[x].push_back(y);
v[y].push_back(x);
deg[x]++;deg[y]++;
if(deg[x]>mx1) {mx2=x;mx1=deg[x];}
if(deg[y]>mx1) {mx2=y;mx1=deg[y];}
}
//找到了度数最大的点,然后进行删边.
q.push(mx2);
bfs();
for(int i=0;i<ans.size();i++)
{
printf("%d %d\n",ans[i].from,ans[i].to);
}
return 0;
}
2333我感觉我应该学图论,感觉自己图论越来越好了,虽然也是个水题Hhhh
统计下度数最大的点作为顶点然后bfs成树即可.

京公网安备 11010502036488号