cf 01mst
Posted hgangang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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<<" "; return 0; }
以上是关于cf 01mst的主要内容,如果未能解决你的问题,请参考以下文章