codeforces 920 E.Connected Components?

/*
求补图的联通分量个数以及长度
思路:
记录不连通边,bfs起点,相连的就读入计数,点集合删除
一直到点集合为空,over
用时:36min
*/
#include<bits/stdc++.h>
using namespace std;

const int N=200005;
int n,m;
map<int,bool>mp[N];
vector<int>node,ans;

int bfs(int st)
{
    int cnt=0;
    queue<int>q;
    q.push(st);
    while(!q.empty())
    {
        int u=q.front();
        q.pop();
        cnt++;
        for(int i=0;i<node.size();i++)
        {
            int v=node[i];
            if(!mp[u][v])
            {
                swap(node[i],node.back());
                node.pop_back();
                i--;
                q.push(v);
            }
        }
    }
    return cnt;
}

int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        node.push_back(i);
    for(int i=1;i<=m;i++)
    {
        int u,v;
        scanf("%d%d",&u,&v);
        mp[u][v]=1;
        mp[v][u]=1;
    }
    while(!node.empty())
    {
        int st=node.back();
        node.pop_back();
        int num=bfs(st);
        if(num)
            ans.push_back(num);
    }
    sort(ans.begin(),ans.end());
    printf("%d\n",ans.size());
    for(int i=0;i<ans.size();i++)
        printf("%d%c",ans[i],i==ans.size()-1?'\n':' ');
}

猜你喜欢

转载自blog.csdn.net/Egqawkq/article/details/79271159
今日推荐