Codeforces Round #599 (Div. 2)D 边很多的只有0和1的MST

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

分析:找全部可以用边权为0的点连起来的全部块

   然后这些块之间相连肯定得通过边权为1的边进行连接

   所以答案就是这些块的总数-1;

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define pb push_back
const int M=1e5+5;
set<int>s,g[M];
int vis[M];
void bfs(int x){
    queue<int>que;
    que.push(x);
    s.erase(x);
    while(!que.empty()){
        int u=que.front();
        que.pop();
        if(vis[u])
            continue;
        vis[u]=1;
        set<int>::iterator it;
        for(it=s.begin();it!=s.end();){
            int v=*it;
            it++;
            if(g[u].find(v)==g[u].end()){///如果这一次找不到的话,就说明这个块中的点有流向它的权值为1的边
                que.push(v);
                s.erase(v);
                
            }
        }
    }
}
int main(){
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        s.insert(i);
    for(int x,y,i=1;i<=m;i++){
        scanf("%d%d",&x,&y);
        g[x].insert(y);
        g[y].insert(x);
    }
    int ans=0;
    for(int i=1;i<=n;i++){
        if(!vis[i]){
            ans++;
            bfs(i);
        }
    }
    printf("%d\n",ans-1);
}
View Code

 

posted @ 2019-11-07 18:07  starve_to_death  阅读(171)  评论(0编辑  收藏  举报