ユニークMST(一意決意の最小スパニングツリー)

その最小スパニングツリーが一意である場合は接続無向グラフを考えると、教えてくれ。 

定義1(スパニングツリー):接続、無向グラフG =(V、E)を考えます。:GのスパニングツリーはGのサブグラフであり、次のプロパティで、Tは、=(V」、E 『)と言う 
= V. 1. V』 
2 Tが接続され、非環状れます。 

定義2(最小スパニングツリー):無向グラフG =(V、E)、接続された、エッジ加重を考えます。Gの最小全域木T =(V、E ')は、最小の総コストを有するスパニングツリーです。Tの総コストは、E」内のすべてのエッジ上の重みの合計を意味します。 

入力

最初の行は、単一の整数t(1 <= T <= 20)、テストケースの数を含んでいます。各ケースは、グラフを表します。これは、2つの整数n及びm(1 <= N <= 100)、ノードおよびエッジの数を含む行から始まります。次のm行の各々は、XIとYIは、重量=のWiと端で接続されていることを示し、三重(XI、YI、WI)を含みます。任意の2つのノードのために、それらを接続する最大1つのエッジがあります。

出力

MSTが一意である場合は、各入力については、文字列の印刷、それ以外の場合の総コストを印刷、または「は一意ではありませんが!」。

サンプル入力

2 
3 3 
1 2 1 
2 3 2 
3 1 3 
4 4 
1 2 2 
2 3 2 
3 4 2 
4 1 2

サンプル出力

3 
固有のものではありません!
#include <cstdioを> 
する#include <iostreamの> 
する#include <CStringの> 
する#include <アルゴリズム> 
の#include <キュー> 
の#include <スタック> 
の#include < セット > 
の#include <ベクトル> 
の#include <地図> 
の#include <cmath>
 const  int型 MAXN = 1E5 + 5 
typedefの長い 長いLL。
使用して 名前空間はstdを、
INT 最初、[MAXN]予め、N、M。
 
構造体ノード
{ 
    int型X、Y、ヴァル。
    int型のuを。
    E;
    int型D; 
} P [MAXN]。
INT見つける(INT X)
{ 
    場合(PRE [X] == X)
    { 
        戻りX。
    } 
    
    { 
        リターン [X]事前= (予備[X])を見つけます。
    } 
} 
INT プライム()
{ 
    int型は、I、J、K、和、NUM。
    合計 = 0 ; NUM = 0 ;
    (i = 1 ; iが<= N; iは++ 
    事前[I] = I。
    (i = 1 ; iが<= M; iは++ ){
        もし(P [i]が.D)続けますint型の FX = (Pは[I] .X)を見つけます。
        INT FY = (Pは[I]・Y)を求めます。
        もし(!FX = FY){ 
            NUM ++ ; 
            事前[FX] = FY。 + = P [i]は.val。
            もし(第一)
            P [i]は.U = 1 
        } 
        であれば(NUM == N- 1ブレーク
    } 
    戻り値の和。
} 
ブールCMP(ノードX、ノードY)
{ 
    もし(x.val < y.val)
     を返す それ以外の
    返し はfalse ; 
} 
int型のmain()
{ 
    int型K、U、V、SUM1、W、SUM2。
    int型T; 
    scanf関数(" %のD "、&T)。
    一方、(T-- 
    { 
        SUM1 = SUM2 = 0 
        memsetの(p、0はsizeof (P))。
        scanf関数(" %d個の%のD "、&​​N、&M)。
        以下のためのint型 I = 1; I <= M; iは++ 
        { 
            scanf関数(" %D%D%D "、&​​P [i]は.X、&P [i]は.Y、&P [I] .val)。
        } 
        のためのint型 I = 1 ; I <= M; iが++ ){
             ためint型 J = I + 1、J <= Mであり、j ++ 
            { 
                場合(P [i]は.val == P [J] .val)P [I] .E = 1 
            } 
        } 
        ソート(P + 1、P + 1 + M、CMP)。 = 1 
        SUM1 =プライム(); 
        第一 = 0 ブールフラグ= 以下のためにint型 I = 1 ; I <= M; iは++ 
        { 
            場合(P [i]が.U && P [I] .E)
            { 
                
                P [i]は.D = 1 
                SUM2 = プライム()。
                もし(SUM1 == SUM2)
                { 
                    フラグ = 
                    printf(" 未ユニーク!\ N ");
                    破ります; 
                } 
            } 
        } 
        もし(!フラグ)
        のprintf(" %d個の\ n " 、SUM1)。
    } 
}

 

おすすめ

転載: www.cnblogs.com/Staceyacm/p/11135078.html