マップ与えられ、そして家がマップ上にあった、人々は、これに行くための最短の道を家を割り当てる方法を尋ねる:質問の意味?
この質問は、完全一致の場合で、あなたがするKMを使用することができ、少なくとも道を行く方法を尋ねました。
しかし、KMアルゴリズムは、最適な最大値を解決するために使用されているので、我々はデータは誰もが家から離れて行くものを変更する必要がありますが、負に変更されています。
そして最後に、すぐに-KM()に来て
1の#include <cstdioを> 2の#include <アルゴリズム> 3の#include < 文字列・H> 4の#include <math.h>の 5の#include <iostreamの> 6 使って 名前空間STDを、 7 のconst int型 MAXN = 1E2 + 10 。 8 CONST INT INF = 0x3f3f3f3f 。 9 INT LX [MAXN]、LY [MAXN]。 10 int型の一致[MAXN]。 11 INT VISX [MAXN]、visy [MAXN]。 12 構造体ノード 13 { 14 INTX、Y。 15 } [MAXN]、B [MAXN]。 16 INT G [MAXN] [MAXN]。 17 int型の沼、麻痺; 18 INT DFS(INT K) 19 { 20 VISX [K] = 1 。 21 のためには、(int型 I = 1 ; I <= NUMA iは++ ){ 22 であれば(!visy [I] && G [K] [I] == LX [K] + LY [I]){ 23 visy [I] = 1 ; 24 であれば(一致[I] ||!{DFS(一致[I])) 25 が一致[I] = K。 26 リターン 1 ; 27 } 28 } 29 } 30 リターン 0 。 31 } 32 INT KM() 33 { 34 のために(int型 I = 1 ; I <= NUMA; iは++ ){ 35 LX [I] = - INF、LY [I] = 0 ; 36 のために(INT J = 1 ; J <= NUMA; J ++ ) 37 LX [I] = MAX(LX [I]、G [I] [J])。 38 } 39 のために(INT K =1 ; K <= NUMAあり、k ++ ){ 40 ながら(1 ){ 41 のmemset(VISX、0、はsizeof (VISX))。 42 のmemset(visy、0、はsizeof (visy))。 43 であれば(DFS(k))をブレーク。 44 INT MN = INF。 45 46 のためには、(int型 I = 1 ; I <= NUMA; iは++)場合(VISX [I]) 47 のための(INT J = 1 ; J <= NUMA; J ++)場合(!visy [J]) 48 MN =分(MN、LX [I] + LY [J] - G [I] [J])。 49 もし(MN == INF)のリターン - 1 。 50 のためには、(int型 I = 1 ; I <= NUMA; iは++)場合(VISX [i])とLXの[I] - = MN。 51 のためには、(int型 I = 1 ; I <= NUMA; iは++)場合(visy [I])LY [I] + = MN。 52 } 53 } 54 INT ANS = 0 。 55 のためには、(int型 i = 1 ; iが= NUMAを<; I ++) 56 であれば(一致[I]) 57の ANS + = G [マッチ[I] [I]。 58の リターンANS; 59 } 60 ボイドのinit() 61 { 62 NUMA =麻痺= 0 。 63 のmemset(一致、0、はsizeof (一致))。 64 のmemset(G、0、はsizeof (G))。 65 } 66 のint main()の 67 { 68 int型N、M。 69 一方(scanf関数(" %D%dの"!、&N、&M)= EOF){ 70 であれば(N == 0 && m個の== 0)ブレーク。 71 のinit(); 72 チャーT。 73 のためには、(int型 i = 0 ; iがn <; iは++ ){ 74 のための(int型 J = 0 ; J <Mであり、j ++ ){ 75 CIN >> T。 76 であれば(Tの== ' H ' ){ 77 NUMA ++ 。 78 [NUMA] .X = I。 79 [NUMA] .Y = J。 80 } 81 そう であれば(Tは== ' M ' ){ 82 麻痺++ 。 83件の B [麻痺] .X = I。 84件の B [麻痺] .Y = J。 85 } 86 } 87 } 88 のための(int型 I = 1 ; I <= NUMA; iは++ ){ 89 のint X1 = [I] .X、Y1 = [I] .Y。 90 のために(int型 = J 1、J <=麻痺; J ++ ){ 91 int型 ×2 = B [J] .X、Y 2 = B [J] .Y。 92 INTファブ(X1-X2)+ファブ(Y1- = W Y2)。 93 G [I] [J] = - W。 94 } 95 } 96 のprintf(" %d個の\ n "、 - KM())。 97 } 98 リターン 0 。 99 }