説明
N×m個の行列は、各ビンの初期重量は0であり、行列は2つの操作を実行できます。
- 行、列の各グリッド値の重みプラス1またはマイナス1を選択します。
- 1、各ビン値の列重みプラス1またはマイナス1を選択します。
K制限、トリプレットにそれぞれ限定された(X、Y、C)、代表的なグリッド(x、y)の重みCに等しいがあります。行列操作の後、すべての制限を満たすように、一連の動作があるかどうかを尋ねます。ある場合は、出力「はい」、そうでない場合は「いいえ」。
入力
最初の入力T(Tは<= 5)T基と、それぞれのデータ形式、入力データを表す:
三つの整数N、M、K(1 <の最初の行 = N、M、K <= 1000)。
次のk行、三つの整数X、Y、Cの各列。
出力
各試験、出力YesまたはNoのため
サンプル入力
2
2 2 4
1 1 0
1 2 0
2 1 2
2 2 2
2 2 4
1 1 0
1 2 0
2 1 2
2 2 1
サンプル出力
はい
ノー
問題の解決策
i行目の西との動作を示し、Yjには、 西ている(I、J、C)のためのj列目の操作を表し+ Yのjは C =
C <=のX iは Y + J > - <= C( - Yのjは)+ C <= X I X 、I -c <=( - YのJ)
Spfaは、トラバースすることができないいくつかのポイントを防ぐ、キュー内のすべてのポイントの先頭に注意を払う、リングを没収するために道路を走りました
胡純粋に口の中、何の権限がないため、支払うことができません
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 const int型 MAXN = 2005 ; int型、T、N、M、K。 int型のCNT、ヘッド[MAXN]、CX [MAXN]。 構造体のエッジ{ int型のY、ヴァル、次。 } E [MAXN << 1 ]。 ボイド追加(int型のx、int型の Y、int型Z){ E [ ++ CNT] = (エッジ){Y、Z、ヘッド[X]}。 ヘッド[X] = CNT。 } INTは[MAXN] DIS。 キュー < 整数 > Q; BOOL VIS [MAXN]。 ブールspfa(){ 中(!q.pop()q.empty()); 用(int型 i = 1 ; iがM <= N +; I ++)はq.push(I)、DIS [I] = 0、CX [I] = 1、VIS [I] = 真。 一方、(!q.empty()){ int型のx = q.front()。 q.pop(); VIS [X] = 偽。 もし(CX [X]> = N + M)を返す 真。 以下のために(int型 ; I I = I =ヘッド[X] {E [I] .next) INT Y = E [I] .Y、ヴァル= Eを[I] .val。 もし(DIS [Y] <DIS [X] + val)で{ DIS [Y] = DIS [X] + ヴァル。 場合(!VIS [Y]){ q.push(Y); VIS [y]は = 真。 もし(++ CX [Y]> = N + M)を返す 真。 } } } } を返す 偽。 } ボイドニース(){ CNT = 0 。 memsetの(頭、0、はsizeof (ヘッド))。 scanf関数(" %D%D%D "、&N、&M、およびK); 以下のために(int型 i = 1 ; iは= Kを<; iは++ ){ int型X、Y、Z。 scanf関数(" %D%D%D "、およびX&Y、およびZ)。 // Z <= X + Y <= Z // Z <= X - ( - Y)<= Z // (-Y)+ Z <= X XZ <=( - y)は (Y + N、追加x 、Z)、(追加X、Y + N - Z)。 } のprintf(" %sのを\ n "、spfa()?" いいえ":" はい" )。 %のD "、&; t)は 、一方(t-- )ニース(); }