問題の意味の説明
スパニングツリーエッジの重みとエッジ重み最大最小最小差、それらの差の全ての出力を求めます。
もちろん私たちはすべて最大右側縁を得ることができるスパニングツリークラスカル最小を実行します。しかし、最小エッジ重みを保証するものではありませ。nは注目<= 100、M <=(N - 1)N / 2、すなわち、M <= 4950、その後、暴力に関する。バックエッジを探し、最小スパニングツリーの最初のエッジとして再列挙各側、ソート、および側面は、ツリーがM未満であるスパニング走った後、各回答線を更新して実行しました。
一AC、O(㎡)の時間計算量は、通過することができます。
#include <cstdioを> する#include <cmath> の#include <CStringの> する#include <アルゴリズム> の#define N 210 の#define M 10000000 使用して 名前空間STD。 INTのN、M。 構造体qwq { int型X、Y、ヴァル。 ブール 演算子 <(CONST qwq&A)のconst { 戻り <値をa.val。 } } E [M]。 INT FA [N]、SIZ [N]。 INT見つける(INT X) { もし =(FA [X]!= X)FA [X]検索(FA [X])。 戻りFAを[X]。 } ボイドマージ(int型のx、int型のY) { 場合(SIZ [X]> SIZ [Y])スワップ(X、Y) SIZ [Y] + = SIZ [X]。 FA [X] = Y。 返します。 } ボイドpre_fa() { ため(int型 i = 1 ; iは= <N; iは++ ) { FA [I] = I。 SIZ [I] = 1 。 } を返します。 } int型クラスカル() { ソート(E + 1、E + 1 + M)。 int型 TOT = 0、ANS = 10000000 ; 用(INT J = 1 ; J <= Mであり、j ++ ) { pre_fa()。 TOT = 0 ; int型 MAXX = 0 ; 以下のために(int型 = jでのI、iは<= M; iは++ ) { int型のx =見つける(E [i]は.X)、Y = 見つける(E [I] .Y)。 もし(X!= y)は { (x、y)をマージ。 MAXX = MAX(MAXX、E [I] .val)。 TOT ++ ; } もし(TOTの== N - 1 ) { ANS =分(MAXX - E [J] .val、ANS)。 破ります; } } } もし(ANS == 10000000)リターン - 1 。 他の リターンANS; } 使用して 名前空間STDを、 INT メイン() { 一方(1 ) { scanf関数(" %D%dの"、&N、&M)。 もし(N M && N == == 0)ブレーク。 memsetの(E、0、はsizeof (e)参照)。 用(int型 I = 1 ; I <= M; iが++ ) { scanf関数(" %D%D%D "、&E [I] .X、&E [I] .Y、&E [I] .val)。 } のprintf(" %d個の\ n " 、クラスカル())。 ; }