レイアウトPOJ - 3169最短、SPFAループ負決意アルゴリズム+

皆と同じように、牛が飼料用にキューイングするとき彼らの友人の近くに立つのが好き。FJは、N(2 <= N <=千)牛が飼料を待って直線に沿って立っ1..Nの番号を付けました。番号が付けられていると牛は同じ順序で立っている、と彼らはかなり強引ことができるので、我々が配置されているとして、それぞれの牛と考えるならば2頭の以上の牛は、それがある(正確に同じ場所に並べることが可能ですいくつかの数直線上の座標で、それは)同じ座標を共有するために2頭の以上の牛が可能です。 

そしてお互いのようないくつかの牛はラインに互いに一定の距離内になりたいです。いくつかは本当にお互いを嫌い、少なくとも一定の距離を隔ててほしいです。ML(1 <= ML <= 10,000)の制約のリストは、互いに等牛及びそれらが分離することができることにより、最大の距離を表します。MDの制約(1 <= MD <= 10,000)のその後のリストがお互いを嫌い、彼らは分離しなければならないことにより、最小距離は牛伝えます。 

あなたの仕事は、可能な場合には、距離の制約を満たす牛1牛のNとの間の最大の可能な距離を計算することです。

入力

1行目:スリースペースで区切られた整数:N、ML、およびMD。 

ライン2..ML + 1:各行は3スペースで区切られた正の整数含ま:A、B、および1 <= A <B <= N.牛AとBとDは、最もD(1 <= Dである必要があります<= 1,000,000)離れ。 

線ML + 2..ML + MD + 1:各行は3スペースで区切られた正の整数含ま:Aが、1 <= A <B <= N.牛AとBとB、及びDは、(少なくともDでなければなりません1 <= D <= 1,000,000)離れ。

出力

1行目:単一の整数。何のラインアップが可能でない場合は、出力-1。牛1とNを任意離れことができる場合、出力-2。それ以外の場合は出力牛1とNの間の最大距離

サンプル入力

4 2 1 
1 3 10 
2 4 20 
2 3 3

サンプル出力

27

ヒント

サンプルの説明: 

4頭の牛があります。牛#1及び#3はせいぜい10個の単位離れなければならない、牛#2及び#4には20以上離れた単位、及びウシ#2及び#3嫌い互いにてはならない、ノー少ない3よりも単位離れなければなりません。 

最良のレイアウトは、数直線上の座標で、牛#2~7における、牛#3 10において、牛#4 27において、0で牛#1を置くことです。
 
MとN S個の点の2例との間の問題点の意味を有し、nはLと点の間の最大値を示し、mはsの最大値と最小点と点L、Q 1を表します。どのくらいの時間。
 
アイデア:質問の意味を得ることができる:Nの場合のD [1] - D [3] <= 10、D [4] - D [2] <= 20、M:D [3] - D [ 2]> = 3、第式D [2]を得るために変換することによって - D [3] <= - 3。イタリアが最も負の短絡を求めることは非常に右であるように。
 
コード:
  1の#include <cstdioを>
   2の#include <fstreamの>
   3の#include <アルゴリズム>
   4の#include <cmath>
   5の#include <両端キュー>
   6の#include <ベクトル>
   7の#include <キュー>
   8の#include < ストリング >
   9#含む<CStringの>
 10の#include <地図>
 11の#include <スタック>
 12の#include < セット >
 13の#include <sstream提供さ>
 14の#include <入出力ストリーム>
15件 の#define MOD 998244353の
 16  の#defineのEPS 1E-6
17  の#define LLロングロング
 18である の#define INFの0x3f3f3f3f
 19。 使用した 名前空間STD;
 20である 
21ことである // 構造記憶されたサイド情報
22である 構造体ノード
 23である {
 24      INT Y、Z、次に、
 25  };
 図26は、あるノードNO [ 10005 ];
 27  // 格納位置エッジ
28  のintヘッド[ 10005 ];
 29  // Sは点の数を表し、nはMLの数はエッジを表し、mはMDのエッジの数を表し
30  INT Sを、N、M;
 31である // ANSは、エッジの数を表します
32  INTANS;
 33である // 他の点に開始点の最小値を表している
34ことである INT DIS [ 10005 ];
 35  //は、点の現在の最小値が見つかったかどうかを決定する
36  BOOL VIS [ 10005 ];
 37 [  // いくつか見つけるために現在のポイントを記録し
38  INT CNT [ 10005 ];
 39  //が最短と負の環が存在するか否かを判定する見つける
40  BOOL SPFA()は
 41であり 、{
 42である     // 初期化
43で      キュー< INT > ク;
 44である      (qu.push 。1 );
 45      のmemset(DIS、INF 、はsizeof(DIS));
 46である      のmemset(VIS、0はsizeof (VIS));
 47      のmemset(CNT、0はsizeof (CNT));
 48      // 開始点を初期化
49      VIS [ 1。 =] 1。;
 50      [DIS 。1 ] = 0 ;
 51      // キューが空の出口である
52である     一方で(!qu.empty())
 53は     、{
 54である         // デキュー
55          INT U = qu.front();
 56である         qu.pop();
 57である         //点の値も変化し、それに接続されているのでポイントの最小値は、変更された
58          VIS [U] = 0 ;
 59          // Uに接続されたエッジトラバーサル
60          のためには、int型 I =頭[U]を。 != I - 1 ; I = NO [I]は.next)
 61である         {
 62は、             int型の V = ; NOは、[I]は.Y
 63である             // 最小更新
64              IF(DIS [V]> DIS [U] + NO [I ] .Z)
 65              {
 66                  DIS [V] DIS [U] + = NO [I] .Zは、
 67                  // 現在のポイントvはラベルを探すために必要がない場合
68                  IF(!VIS [V])
 69                  {
70                      // マーカ点V 
71は                      VIS [V] = 1 ;
 72                      qu.push(V);
 73である                     // 回数検索レコードストア
74                      CNTは[V] ++ ;
 75                      // 数がnより大きい場合、負の環を表します
76                      IF(CNT [V]> N-)
 77                      {
 78                          リターン falseに;
 79                      }
 80                  }
 81              }
 82          }
 83      }
 84  }
 85  INTmain()の
 86  {
 87      のscanf(" %D%D%D "、&​​S、&N、&M)。
88      int型のU、V、L。
89の      ANS = 1 90      // 初始化
91      のmemset(ヘッド、 - 1はsizeof (ヘッド))。
92      // 正向记录边
93      のためのint型 i = 1 ; iは<N =、iは++ 94      {
 95          のscanf(" %D%D%D "、&​​U&V、&L)。
96の          NO [ANS] .Y =V;
97          NO [ANS] .Z = L。
98          NO [ANS] .next = 頭部[U]。
99          頭[U] = ANS ++ 100      }
 101      // 反向记录边
102      のためのint型 I = 1 ; I <= M; iは++ 103      {
 104          のscanf(" %D%D%D "、&​​U&V、およびL)を、
105ない          NO [ANS] .Y = U。
106          NO [ANS] .Z = - L。
107          NO [ANS] .next = 頭部[V]。
108          頭[V] = ANS ++;
 109      }
 110      // ないループ負出力ソリューション-1出力-2を示す場合が多い無限溶液は、溶液の出力ソリューションが存在しないがあれば
111      IF (SPFA())
 112      {
 113          IF(DIS [S] == INF)
 114          {
 115              のprintf(" -2 \ N- " );
 1 16          }
 117          そう
1 18          {
 119              のprintf(" %Dの\のN- " 、DIS [S]);
 120          }
 121      }
 122      そう
123      {
 124          のprintf(" -1 \ nを" );
125      }
 126  
127 }

 

おすすめ

転載: www.cnblogs.com/mzchuan/p/11568371.html