题: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); }
原文地址:https://www.cnblogs.com/starve/p/11813996.html
时间: 2024-11-07 21:42:08