F1. Spanning Tree with Maximum Degree(度最大生成树)

题意

给你n nn个点m mm条边的无向联通图,找出一棵生成树,使度最大的点的度最大。

1≤n,m≤105 1 \leq n,m \leq 10^51≤n,m≤10 
5
 
解析:

度最大的点一定是原图度最大的点,记录度数,从度最大的点开始遍历生成树

ac:

#include<bits/stdc++.h>
#define MAXN 200005
using namespace std;

typedef pair <int, int> pii;

vector<int> mp[MAXN];
vector<pii> ans;

int in[MAXN]={0};
int vis[MAXN];

void bfs(int st)
{
    vis[st]=1;
    queue<int> que;
    que.push(st);
    while(!que.empty())
    {
        int u=que.front();
        que.pop();
        for(int i=0;i<mp[u].size();i++)
        {
            int v=mp[u][i];
            if(vis[v]==0)
            {
                vis[v]=1;
                que.push(v);
                ans.push_back(pii(u,v));
            }
        }
    }
}

int main()
{
    int n,m,u,v;
    scanf("%d%d",&n,&m);
    memset(vis,0,sizeof(vis));
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d",&u,&v);
        mp[u].push_back(v);
        mp[v].push_back(u);
        in[u]++;
        in[v]++;
    }
    int maxs=0,st;
    for(int i=1;i<=n;i++)
    {
        if(in[i]>maxs)
        {
            maxs=in[i];
            st=i;
        }
    }
    bfs(st);
    for(int i=0;i<ans.size();i++)
        printf("%d %d\n",ans[i].first,ans[i].second);

    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_41183791/article/details/88365764
今日推荐