题意
给你一个图,让你构造出一个编号为1的点的度数为k的树,树的顶点数等于图的顶点数
题解
考虑与顶点1连接的顶点数num1
去掉顶点1后,整个图被分为num2个连通块
只要num2<=k<=num1就就行了
代码
#include <bits/stdc++.h> using namespace std; int n,m,k; const int maxn=2*1e5+100; vector<int> g[maxn]; int vis[maxn]; vector<int> d[maxn]; void dfs(int i,int cnt) { int num=g[i].size(),v; for(int j=0;j<num;j++){ v=g[i][j]; if(v==1){ d[cnt].push_back(i); continue; } if(vis[v]==1)continue; vis[v]=1; dfs(v,cnt); } } void dfs2(int i) { int num=g[i].size(); int v; for(int j=0;j<num;j++){ v=g[i][j]; if(vis[v]==1)continue; cout<<i<<' '<<v<<endl; vis[v]=1; dfs2(v); } } int main() { cin>>n>>m>>k; int a,b; for(int i=0;i<m;i++){ cin>>a>>b; g[a].push_back(b); g[b].push_back(a); } int num=g[1].size(),v,cnt=0; for(int i=0;i<num;i++){ v=g[1][i]; if(vis[v]==0){ vis[v]=1; dfs(v,cnt); cnt++; } } if(k>num||k<cnt)cout<<"NO"<<endl; else { cout<<"YES"<<endl; memset(vis,0,sizeof(vis)); vis[1]=1; int cnt2=cnt; for(int i=0;i<cnt;i++){ v=d[i][0]; cout<<1<<' '<<v<<endl; vis[v]=1; } for(int i=0;i<cnt;i++){ if(cnt2==k)break; num=d[i].size(); for(int j=1;j<num;j++){ if(cnt2==k)break; v=d[i][j]; cout<<1<<' '<<v<<endl; vis[v]=1; cnt2++; } } for(int i=2;i<=n;i++){ if(vis[i]==1){ dfs2(i); } } } return 0; } /* 4 4 2 1 2 1 3 1 4 2 3 */