CodeForces - 1243D(思考+互いに素セット)

問題の意味

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を返します。
}

  

おすすめ

転載: www.cnblogs.com/mcq1999/p/11983919.html