トピックリンク:ポイント私はああ╭(╯^╰)╮
効果の件名:
完全グラフポイントが
与えられました
、右側縁
、
他の側が右であります
最小スパニングツリー
問題解決のアイデア:
表題の補完に接続されたブロック図の数
それぞれ列挙を未処理の点を、ワイド検索
および各側に原稿を列挙し、マーカーでマークされた
点と非標識ある点列挙補数図は、通信ブロックに属する
これらのキューに入れられた標識されていない点、広い探索
ポイントで最適化処理チェーン、処理された削除リスト上の点
の時間複雑。
列挙側の総複雑さは、次のとおりです。
点は、2つのケースに分割される列挙:
①:ポイントがマークされていない、唯一のエンキュー後の各点をキューに入れられた
②:点は、オペレータの時間複雑さをマークされています
インナー
コア:ピクチャーチェーンの最適化、補密マップ
#include<bits/stdc++.h>
#define rint register int
#define deb(x) cerr<<#x<<" = "<<(x)<<'\n';
using namespace std;
typedef long long ll;
using pii = pair <ll,int>;
const int maxn = 2e5 + 5;
int n, m, ans[maxn], cnt;
int l[maxn], r[maxn];
int vis[maxn], vis2[maxn];
vector <int> g[maxn];
inline void del(int x){
l[r[x]] = l[x];
r[l[x]] = r[x];
}
void bfs(int x){
vis[x] = ans[++cnt] = 1;
queue <int> Q;
Q.push(x); del(x);
while(Q.size()){
int q = Q.front(); Q.pop();
for(auto v : g[q])
if(!vis[v]) vis2[v] = 1;
for(int i=r[0]; i; i=r[i])
if(!vis2[i]) {
Q.push(i);
del(i);
vis[i] = 1;
++ans[cnt];
} else vis2[i] = 0;
}
}
int main() {
scanf("%d%d", &n, &m);
for(int i=1, u, v; i<=m; i++) {
scanf("%d%d", &u, &v);
g[u].push_back(v);
g[v].push_back(u);
}
for(int i=0; i<=n; i++) l[i] = i-1, r[i] = i+1;
r[n] = 0;
for(int i=1; i<=n; i++)
if(!vis[i]) bfs(i);
printf("%d\n", cnt - 1);
}