タイトル説明
あなたが三鹿ミルク会社を引き継ぐ初日は不幸な事がありました。同社は、誤っメラミンミルクのグループを送りました。残念ながら、あなたがそれを見つけたとき、メラミンミルクが配信ネットワークに入っているがあります。配信ネットワークは、大規模かつ複雑な関係です。あなたは、小売業者に送信されるこれらのミルクのどの知っているが、多くの方法がありますが、これらのミルクに手を入れてください。配信ネットワークは、倉庫の数で構成され、トラックが構成する、各トラックはそれぞれ牛乳二倉庫一方向性輸送の間に固定されています。メラミンの牛乳をトレースするとき、特定の輸送トラック輸送を停止させる必要がある、それは小売業者に配信されないことを保証することが必要であるが、各トラックは、特定の経済的損失を持っています停止しました。あなたの仕事は、損失を最小限にするためにトラックの停止液を開発していない、悪い牛乳前提の小売業者に保証するために、です。
入出力フォーマット
入力フォーマット:
最初の行の2つの整数N(2 <= N <= 32)、M(0 <= M <= 1000)、Nは、Mはトラックの数である、倉庫の数を表します。工場の代わりに1つの倉庫配送、倉庫Nは、小売業者に送信されるメラミンミルクを表します。第2..M + 1行:各3のSi、EI、CIの整数を裏打ち。ここでSiは、Eiが出発倉庫トラック、目的倉庫を表します。CI(iは= 2,000,000 <0 <= C)がトラックストップロス輸送をさせ表さ。
出力フォーマット:
二つの整数C、T:Cが最小損失を表し、Tは、少なくとも停止するように、前提の最小の損失でトラックの数を表します。
サンプル入力と出力
入力サンプル#1:
コピー
4 1 3 100 3 2 50 2 4 60 1 2 40 2 3 80
出力サンプル#1:
コピー
コードの表示
601
エッジ・セットの数明らかに対象となる最小カットカットはまた、必要最小限の必要
トリッキーな練習を採用することができます
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 // BXDによる入力 の#define担当者(iは、b)のための(; iは=(b)の<I ++はiは(A)= INT) の#defineためreppを(I、B)(I =(A int型); I> =(B); - I) の#define RI(N)のscanf( "%d個"、&(N)) の#define RII(N、M)のscanf( "%D%dの"、およびN、 &M) の#define RIII(N、M、K)のscanf( "%D%D%D"、&N、&M&K) の#define RS(S)のscanf( "%sの"、S); #defineは長い長いっ の#define PBの一back用 の#define REP(I、N)のための(; iが(N)<I ++は、I = 0をINT) の#define CLR(A、V)のmemset(A、V、 CONSTの INT N = 4E3 + 44 。 const int型 M = 4E3 + 54 。 構造体の縁{ へLL次、W。 } E [M << 1 ]。 int型のヘッド[N]、POS = 1 。 ボイド追加(LLのX、Y LL、LL Z){ E [ ++ POS] = (エッジ){Y、ヘッド[x]は、Z}。 ヘッド[X] = POS。 E [ ++ POS] =(エッジ){X、ヘッド[Y]、0 }。 ヘッド[Y] = POS。 } int型のレベル[N]。 ブール BFS(int型の、int型T){ memsetの(レベル0、はsizeof レベル)。 キュー <LL> Q; レベル[S] = 1 。 q.push(S); しばらく(!q.empty()){ int型の POS = q.front(); q.pop(); 用(int型 ; I; I =ヘッド[POS] I = E [I] .next){ int型 NX = E [I] .TO。 もし(E [i]が.W ||レベル[NX]!)続けます。 レベル[NX] =レベル[POS] + 1 。 q.push(NX)。 } } リターン・レベル[T]。 } LL DFS(LL sで、LL Tは、流れLL){ もし、(S == T)リターンフロー。 LL RET = 0 。 以下のために(int型 ;流量&& I I = I =ヘッド[S] {E [I] .next) INT NX = Eを[I] .TO。 もし(レベル[NX] ==レベル[S] + 1 && E [I] .W){ LLのTMP = DFS(NX、T、分(流れ、E [I] .W))。 E [i]は.W - = TMP。 E [I ^ 1 ] .W + = TMP。 流れ - =TMP; RET + = TMP; } } もしレベル[S] =(RET!)0 。 リターンRET; } のLL dinic(LL秒、のLL T){ LL RET = 0 。 一方、(BFS(S、T))RET + = DFS(S、T、INF)。 リターンRET; } LL N、M、S、T、T、A、B、C、X、K、C2、合計。 INT メイン() { CIN >> N >> M。 担当者(I、1 、M) { scanf関数(" %LLD%LLD%LLD "、&、&B、&C)、追加(A、B、C×(M +1)+ 1 )。 } LL ANS = dinic(1 、N) printf(" %のLLDの%のLLD "、ANS /(M + 1)、ANS%(M + 1 ))。 リターン 0 ; }