题意:
给你一张 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\n",ans-1); return 0; }