[マトリックス] BZOJ4500

フェイス質問

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 
}

 

おすすめ

転載: www.cnblogs.com/shxnb666/p/11324033.html