cf1133 F2. Spanning Tree with One Fixed Degree

#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> P;
vector<int> vec1[200010];
vector<int> vec2[200010];
vector<P> ans;
queue<int> que;
int color[200010];
int n,m,D,cnt;
bool cmp(int a,int b)
{
    return color[a]<color[b];
}
void bfs1(int s)
{
    que.push(s);
    color[s]=cnt;
    while(!que.empty())
    {
        int now=que.front();
        que.pop();
        for(int i=0;i<vec1[now].size();i++)
        {
            int to=vec1[now][i];
            if(to==1||color[to]!=0)
               continue;
            ans.push_back(P(now,to));
            que.push(to);
            color[to]=cnt;
        }
    }
}
void bfs2(int s)
{
    que.push(s);
    color[s]=1;
    while(!que.empty())
    {
        int now=que.front();
        que.pop();
        for(int i=0;i<vec2[now].size();i++)
        {
            int to=vec2[now][i];
            if(color[to]!=0)
               continue;
            ans.push_back(P(now,to));
            que.push(to);
            color[to]=1;
        }
    }
}
int main()
{
    scanf("%d%d%d",&n,&m,&D);
    while(m--)
    {
        int u,v;
        scanf("%d%d",&u,&v);
        vec1[u].push_back(v);
        vec1[v].push_back(u);
    }
    for(int i=2;i<=n;i++)
    {
        if(color[i]==0)
        {
            cnt++;
            bfs1(i);
        }
    }
    if(cnt>D||vec1[1].size()<D)
    {
        printf("NO
");
        return 0;
    }
    sort(vec1[1].begin(),vec1[1].end(),cmp);
    for(int i=0;i<vec1[1].size()&&D;i++)
    {
        int to=vec1[1][i];
        if( (i==0)||(i>0&&color[ vec1[1][i-1] ]!=color[to]))
        {
            ans.push_back(P(1,to));
            D--;
        }
    }
    for(int i=1;i<vec1[1].size()&&D;i++)
    {
        int to=vec1[1][i];
        if( (i==0)||(i>0&&color[ vec1[1][i-1] ]==color[to]))
        {
            ans.push_back(P(1,to));
            D--;
        }
    }
    for(int i=0;i<ans.size();i++)
    {
        P pp=ans[i];
        int now=pp.first;
        int to=pp.second;
        vec2[now].push_back(to);
        vec2[to].push_back(now);
    }
    ans.clear();
    for(int i=1;i<=n;i++)
      color[i]=0;
    bfs2(1);
    printf("YES
");
    for(int i=0;i<ans.size();i++)
    {
        printf("%d %d
",ans[i].first,ans[i].second);
    }
}
原文地址:https://www.cnblogs.com/lishengkangshidatiancai/p/10528342.html