問題の意味
https://vjudge.net/problem/CodeForces-1243D
そこ完全グラフであり、nはノード
そこ右側縁mが1で、残りはすべて0です
これは、あなたメートルのエッジを与えるだろう
あなたは、このグラフの最小スパニングツリーの右側の値を尋ねます
思考
アイデアは、通信ブロックの複数の0収縮構成の重量は非常にシンプルエッジであり、答えが接続されているブロックの数-1です。
しかしながら、エッジのあまり数は、* nはゼロの重みを有する(N-1)/ 2-Mのエッジストリップがあります。
各点について検討して、その設定点に接続されたエッジの数を計算するためのポイントは、マップメモリと、配置され、次いで、対応するセットのサイズ(ポイント)、前者はそう、後者よりも小さい場合、このコレクションをポイントならびにいくつかのエッジ重み0の値なので、この点は、コレクションに追加することができます。
合併は現在のコレクションには、この時点で明確に考えるようになると、逆方向に書き込まないことを注意!それ以外の場合はTLE12。
最終的な答えは、接続されているブロックから1を引いた数です。
ここでは、無向グラフ有向グラフになることができ、彼はこの点だけよりも小さな点、時間の節約と考えるときにのみ、その側面よりもさらに小さい点までの各点は、その横断していること。
コード
#include <ビット/ STDC ++ H> 名前空間STDを使用して、 #define INF 0x3f3f3f3f の#define LL長い長 のconst int型N = 200005。 const int型MOD = 1E9 + 7。 constのダブルEPS = 1E-8; constのダブルPI = ACOS(-1.0); #define lowbit(X)(X&( - X)) ベクトル<INT> G [N]。 INT F [N]、SZ [N]。 int型の検索(int型X) { ([x]はx == f)の場合は リターンX。 リターンF [X] =検索(F [X])。 } int型のmain() { int型N、M。 scanf関数( "%D%D"、&N、&M)。 以下のために(INT I 1 =; I <= N; I ++) F [I] = I、SZ [I] = 1。 以下のために(INT I 1 =; I <= M; I ++) { int型、U、V。 scanf関数( "%D%D"、 IF(U <V)//搜索有序化 スワップ(U、V)。 G [U] .push_back(V)。 } ベクトル<整数> H。 以下のために(INT I 1 =; I <= N; I ++) { マップ<整数、整数>;融点 以下のための(int型J:G [i])と 融点[検索(J)] ++; (INTのJ:H)のために { INT Fiの=は、(i)、FJ =(j)を見つける見つけます。 もし(FI = FJ && MP [FJ <SZ [FJ]!) { F [Fiの] = FJ。 SZ [FJ] + = SZ [Fiの]。 } } もし(見つける(I)== I) h.push_back(I)。 } INT ANS = 0。 以下のために(INT I 1 =; I <= N; I ++) { もし(見つける(I)== I) ANS ++; } のprintf( "%D \ n"は、ANS-1)。 0を返します。 }