その最小スパニングツリーが一意である場合は接続無向グラフを考えると、教えてくれ。
定義1(スパニングツリー):接続、無向グラフG =(V、E)を考えます。:GのスパニングツリーはGのサブグラフであり、次のプロパティで、Tは、=(V」、E 『)と言う
= V. 1. V』
2 Tが接続され、非環状れます。
定義2(最小スパニングツリー):無向グラフG =(V、E)、接続された、エッジ加重を考えます。Gの最小全域木T =(V、E ')は、最小の総コストを有するスパニングツリーです。Tの総コストは、E」内のすべてのエッジ上の重みの合計を意味します。
定義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)。 } }