トラックHistory--最小スパニングツリー

トピックリンク

 

質問の意味:

7文字のN入力文字列。番号に対応する異なる位置の二つの文字列間の距離。

ソリューション:

テンプレートを生成するために最低限

各処理間の暴力距離二つの文字列(すなわち、二つの文字列間の差の数)

それはプリムととても密グラフがあるが、私は怠け者だから~~クラスカルよりも良いです

 

コード:

#include <iostreamの> 
する#include <stdio.hに> 
する#include <math.h>の
書式#include <アルゴリズム> 
の#include <ベクトル>
 使用して 名前空間STD。
typedefの長い 長いLL。
const  int型 MAXN = 2010 ;
INT [MAXN] F。
チャー S [MAXN] [ 10 ]。
int型N、CNT、Q。
構造体ノード
{ 
    int型U、V、W。
    ブール 演算子 <(constのノード&A)のconst 
    { 
        リターン <W AW。
    } 
}エッジ[MAXN * MAXN]。

INT検索(int型X)
{ 
    戻り X == F [x]はx:F [X] = 検索(F [X])。
} 
ボイド追加(INT U、INT V、INT W)
{ 
    エッジ[CNT] .U = U。
    エッジ[CNT] .V = V。
    エッジ[CNT。++]、W = W。
} 

INT クラスカル()
{ 
    int型 ANS = 0 以下のためにint型 I = 0 F [I] = iは++; iが<= N)I。
    ソート(エッジ、エッジ + 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。
        } 
    } 
    戻りANS。
} 
int型 get_disを(char型 []、チャーB [])
{ 
    int型ANS = 0 ;
    以下のためにint型 i = 0 ; iは< 7 iは++; 
    { 
        場合([I] = B [i]は!)ANS ++ 
    } 
    戻りANS。
} 
int型のmain()
{ 

    ながら(〜のscanf(" %d個"、&​​N)&& N)
    { 
        ためint型 i = 0 ; iがn <; iは++)のscanf(" %sの" 、S [I])。
        CNT = 0 ;
        以下のためのint型 I = 0; iがN <; I ++)のためのINT J = I + 1、J <nであり、j ++ 
        { 
            int型 DIS = get_dis(S [i]は、S [J])。
            (I、J、DIS)を追加します。
        } 
        int型の FM = クラスカル()。
        printf(" 最高可能品質は1 /%dの\ nである。" 、FM)。

    } 
    戻り 0 
}
クラスカル

 

おすすめ

転載: www.cnblogs.com/j666/p/11616908.html