cf 01mst

https://codeforces.com/contest/1243/problem/D

题意是说:给一个图对吧,然后给出点与点的关系,边权为1,没有给出的点与点关系,则这两点边权为0,求出最小生成树权值。

因为0边也可以作为权值,而题目中边数多,而且我们知道肯定是优选边为0的,所以只需找出边权为0的联通块,这些联通块边权都是0,不同联通块之间用边权为1的连起来,也就是需要块数-1的边。

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1e5+10;
set<int>G[N],s;
int vis[N];
void bfs(int x)
{
    queue<int>q;
    q.push(x);
    s.erase(x);
    while(q.size()>0)
    {
        int y=q.front();
        q.pop();
        if(vis[y])
            continue;
        vis[y]=1;

        for(auto it=s.begin();it!=s.end();)
        {
            int v=*it;
            ++it;
            if(G[y].find(v)==G[y].end())
            {
                q.push(v);//cout<<"-";
                s.erase(v);
            }
        }
    }
}
int main()
{
   int n,m;
   cin>>n>>m;
   for(int i=1;i<=n;i++)
   {
       s.insert(i);
   }
   for(int i=1;i<=m;i++)
   {
       int x,y;
       cin>>x>>y;
       G[x].insert(y);
       G[y].insert(x);
   }
   int ans=0;

   for(int i=1;i<=n;i++)
   {
       if(!vis[i])
       {
           bfs(i);
           ans++;
       }
   }
   cout<<ans-1<<"\n";
    return 0;
}

  

猜你喜欢

转载自www.cnblogs.com/hgangang/p/11910870.html
cf
今日推荐