KMのPOJ 2195

マップ与えられ、そして家がマップ上にあった、人々は、これに行くための最短の道を家を割り当てる方法を尋ねる:質問の意味?

この質問は、完全一致の場合で、あなたがする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 }

 

おすすめ

転載: www.cnblogs.com/pangbi/p/11529581.html