質問の意味:
M n点あなたが最小スパニングツリーの右端を見つけます
ソリューション:
最小スパニングツリーベアボード
コード:
#include <iostreamの> する#include <stdio.hに> する#include <math.h>の 書式#include <アルゴリズム> の#include <ベクトル> 使用して 名前空間STD。 typedefの長い 長いLL。 const int型 MAXN = 50 ; INT [MAXN] F。 int型nは、CNT; 構造体ノード { int型U、V、W。 ブール 演算子 <(constのノード&A)のconst { リターン <W AW。 } }エッジ[MAXN * MAXN]。 INT検索(int型X) { 戻り X == F [x]はx:F [X] = 検索(F [X])。 } INT クラスカル() { int型 ANS = 0 。 以下のために(int型 I = 0 F [I] = iは++; iが<= N)I。 int型の合計= 0 ; ソート(エッジ、エッジ + CNT)。 以下のために(int型 i = 0 ; iはCNT <I ++の) { int型のx = エッジを[I] .U。 INT Y = エッジ[I] .V。 int型の FX =(x)を検索。 int型 FY = (y)を見つけます。 もし(!FX = FY) { F [FX] = FY。 ANS + = エッジ[I] .W。 合計 ++ ; } であれば(和== N- 1)ブレーク。 } 戻りANS。 } int型のmain() { int型、N M。 一方、(〜のscanf(" %d個の%のD "、&N、&M)&& N) { CNT =のM。 ために(int型私= 0 ; iがn = <; iは++)F [I] = I。 以下のために(int型 i = 0 ; iがm <; iは++ ) { int型、U、V、W。 scanf関数(" %D%D%D "、およびuは、&V、およびW) エッジ[I] .U = U。 エッジ[I] .V = V。 エッジ[I] .W = W。 } のprintf(" %d個の\ n " 、クラスカル())。 } 戻り 0 。 }