皆と同じように、牛が飼料用にキューイングするとき彼らの友人の近くに立つのが好き。FJは、N(2 <= N <=千)牛が飼料を待って直線に沿って立っ1..Nの番号を付けました。番号が付けられていると牛は同じ順序で立っている、と彼らはかなり強引ことができるので、我々が配置されているとして、それぞれの牛と考えるならば2頭の以上の牛は、それがある(正確に同じ場所に並べることが可能ですいくつかの数直線上の座標で、それは)同じ座標を共有するために2頭の以上の牛が可能です。
そしてお互いのようないくつかの牛はラインに互いに一定の距離内になりたいです。いくつかは本当にお互いを嫌い、少なくとも一定の距離を隔ててほしいです。ML(1 <= ML <= 10,000)の制約のリストは、互いに等牛及びそれらが分離することができることにより、最大の距離を表します。MDの制約(1 <= MD <= 10,000)のその後のリストがお互いを嫌い、彼らは分離しなければならないことにより、最小距離は牛伝えます。
あなたの仕事は、可能な場合には、距離の制約を満たす牛1牛のNとの間の最大の可能な距離を計算することです。
そしてお互いのようないくつかの牛はラインに互いに一定の距離内になりたいです。いくつかは本当にお互いを嫌い、少なくとも一定の距離を隔ててほしいです。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)離れ。
ライン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を置くことです。
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 }