zoukankan      html  css  js  c++  java
  • CF1242B 0-1MST(思维)

    题意:

    给你一张 n 个点的完全图,其中有 m 条边长度为 1,其余全为 0。问你这张图的最小生成树为多少。

    题解:

    就是求补图的连通块数量减一,可以用set的count函数来建立补图,具体看代码。

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=1e5+100;
    set<int> g[maxn];
    int N,M;
    set<int> st;
    int visit[maxn];
    set<int> ::iterator it;
    void bfs (int x) {
        queue<int> q;
        st.erase(x);
        q.push(x);
        visit[x]=1;
        while (!q.empty()) {
            int k=q.front();
            q.pop();
            for (it=st.begin();it!=st.end();) {
                int v=*it++;//后面可能要删除,所以先增加
                if (g[v].count(k)==0) {
                    //表明与k相连的没有
                    st.erase(v);//已经访问过了,所以删掉
                    q.push(v);
                    visit[v]=1;
                }
            }
        }
    }
    
    int main () {
        scanf("%d%d",&N,&M);
        for (int i=1;i<=N;i++) st.insert(i);
        while (M--) {
            int x,y;
            scanf("%d%d",&x,&y);
            g[x].insert(y);
            g[y].insert(x);
        }
        int ans=0;
        for (int i=1;i<=N;i++)
            if (!visit[i]) {
                ans++;
                bfs(i);
            }
        printf("%d
    ",ans-1);
            return 0;
    }
  • 相关阅读:
    深入理解java异常处理机制
    i2c总线
    运行时类型识别(RTTI)
    bcg界面库总结
    c++ 虚函数表
    宽字符,宽字符串
    c++异常处理
    内存管理
    c++中使用联合体
    MFC自定义消息
  • 原文地址:https://www.cnblogs.com/zhanglichen/p/12817329.html
Copyright © 2011-2022 走看看