フェイス質問
http://darkbzoj.tk/problem/4500
問題の解決策
まず、行または列と確かに意味がない、それは、各列の各列の等価で加算および減算は、それらが追加交差点の値に等しい値を有します。
提供$ DIS [I](1 <= iが= N <)$ iは付加価値(正または負であってもよい)$ 1行目の$意味を
$ディス[N + J](1 <= jの<= M)を添加し(前出)の$ J $列の反対の値の$意味
$のhxh $を開始した貧しい人々のためのその後書面、(私の現在の教師の$ WSYの$と$ hxh $言葉はただのように見える....)正の数を追加するに等しい負担の数が、それは、方程式であることを教えてくれる、差動制約が行うために使用することができますが、それらはすべて式等号に取られたので、その直接のサブ$ DISの$値$のDFS $はそれのそれぞれの側のニーズを満たしています。
(これは、片側の代表例として見られる可変式のように見える各点は$ zhhx $を言うことができる?最後に見られます)
#include <ベクトル> の#include <cstdioを> する#include <CStringの> する#include <iostreamの> する#include <アルゴリズム> の#define N 2050 の#define RIレジスタint型 の#define INF十億七 使用 名前空間STD。 インラインint型リード(){ int型 RET = 0、F = 0。チャー CH = GETCHAR()。 一方、(CH < ' 0 ' || CH> ' 9 ')は、f | =(CH == ' - ')、CH =getchar関数(); 一方、(CH> = ' 0 ' && CH <= ' 9 ')RET * = 10、RET + =(CH- ' 0 ')、CH = GETCHAR()。 リターン F - ?RET:RET; } int型N、M、K、DIS [N]。 BOOLすることができます= 0 ; ベクター < INT > [N]に、LEN [N]。 ボイドクリア(){ memsetの(DIS、0x3fを、はsizeof (DIS))。 用(RI i = 1 ; iが= N + M <; Iは++ )[I] .clear()、LEN [I] .clear()に; } ボイド add_edge(INT U、INT V、int型L){ に[U] .push_back(V)。LEN [U] .push_back(L)。 } BOOL DFS(INT X){ ため(RI i = 0 ; iが<[X] .size(); iは++ ){ int型、Y = に[X] [I]; 場合(DIS [Y]> INF){ DIS [Y]は = DIS [X] + LEN [X] [I]; もし(!DFS(Y))の戻り 0 ; } 他{ 場合(!DIS [Y] = DIS [X] + LEN [X] [i])とリターン 0 。 } } リターン 1 ; } ブール(){チェック のため(RI i = 1 ; iが<; M = N + iが++)場合(DIS [I]> INF){ DIS [I] = 0 。 もし(!DFS(I))の戻り 0 ; } リターン 1 。 } int型のmain(){ int型 T = 読み取ります()。 一方、(T-- ){ N =)(読み取ります。M =読み取ります(); K = リード()。 クリア(); 用(RI i = 1 ; iは= Kを<; Iは++ ){ int型X =読み取る()、y)は(読み取り= C = 読み取ります(); add_edge(X、Y + N、C)。 add_edge(Y + N、X、 - C)。 } プット(チェック() ?" はい":" ノー" ); } 戻り 0 。 }