質問の意味:
N個の個別、Mの関係、各関係の要件がありますが、1とギフトのための別の人、そして少しの贈り物として、ほとんどの人々のギフト配達に一人だけがあります。そしてギフトプログラムの出力。
考える:この質問は、トラブルのネットワークフローモデル(ナンセンス)を変換です。
最も重要な要因は、それがこの文はナンセンスですが、お互いに贈り物をすることではなく、一人だけが、贈り物を送信するために別の人を与えることができ、各ペア間の関係である。このため、我々はポイントに合わせて直接構築された人々を考慮すれば、最終的なプログラムは、問題になります。(同じ流量が、プログラム・エラー)。
#pragma GCCの最適化(2) の#pragma G ++最適化(2) の#pragmaコメント(リンカー、 "/ STACK:102400000,102400000") の#include <ビット/ STDC ++ H> の#include <cstdioを> する#include <ベクトル> の#define担当者(iは、、B)のための(iは= int型、iが<= bは、iが++) の#define DEP(I、B、A)(iはBを= int型;方には> =; i--) の#define CLR(B)のmemset(A、B、はsizeof(A)) の#define PB一back の#define PII対<整数、整数> 使用して 名前空間STDを、 typedefの長い 長いLL。 const int型 MAXN = 200010 ; CONST int型 INF = 0x3f3f3f3f 。 LL RD() { LL、X = 0、F = 1。チャー CH = GETCHAR()。 一方、(CH < ' 0 ' || CH> ' 9 '){ 場合(CH == ' - ')、F = - 1 ; CH = GETCHAR();} 一方(CH> = ' 0 ' && CH <= ' 9 '){X = X * 10 + CH- ' 0 ' ; CH = GETCHAR();} リターンのx *のF; } CONST INFLL = LL 0x3f3f3f3f3f3f3f3f 。 const int型 INF = 0x3f3f3f3f 。 構造体のエッジ{ int型、流れ、NXTに、 エッジ(){} エッジ(INTに、INT NXT、INT 流れ)に(に)、NXT(NXT)、フロー(流れ){} }エッジ[MAXN << 2 ]。 int型のヘッドは、[MAXN]、[MAXN] DEP。 int型S、T; INT N、N、M、TOT、CNT。 ベクトル <ペア< int型、int型 >> VA; 空隙INIT(int型N){ N = N。 以下のために(int型 i = 0 ; iは= Nを<; ++ I)ヘッド[I] = - 1 。 TOT = 0 ; } ボイド ADDV(INT U、INT V、INT W、INT RW = 0 ){ エッジ[TOT] = エッジ(V、ヘッド[U]、W)。 ヘッド[U]は ++ TOTを= 。 エッジ【TOT] = エッジ(U、ヘッド[V]、RW)。 ヘッド[V] = TOT ++ 。 } ブールBFS(){ ため(int型 I = 0 ; iが= Nを<; ++ i)はDEP [I] = - 1 。 キュー < 整数 > Q; q.push(S)。 DEP [S] = 1 。 しばらく(!q.empty()){ int型のu = q.front(); q.pop(); 用(int型 ;〜I I = I =ヘッド[U] {エッジ[i]は.nxt) 場合 - (エッジ[I] .flow && DEP [エッジ[I] .TO] == 1 ){ DEP [エッジ[I] .TO] = DEP [U] + 1 。 q.push(エッジ[I] .TO)。 } } } 戻り DEP [T] < 0?0:1 。 } INT DFS(INT U、INT F){ 場合(Uは== T || Fの== 0)リターンF。 INT =使用、wは0 。 用(int型 ;〜I; I =ヘッド[U] I = エッジ[I] .nxt){ 場合(エッジ[I] .flow && DEP [エッジ[I] .TO] == DEP [U] + 1 ) { W DFS(エッジ= [I] .TO、分(F -使用、エッジ[I] .flow))。 エッジ[I] .flow - = W。 エッジ[I ^ 1 ] .flow + = W。 使用 + = W。 もし(使用==のF)リターンF。 } } もし、[U] = DEP - (使用!)1 。 リターンが使用され; } int型Dicnic(){ int型 ANS = 0 。 一方、(BFS()){ ANS + = DFS(S、INF)。 } 戻りANS。 } INT [VS 5010 ] [ 5010 ]。 ブールチェック(INT RES){ 初期化(T)。 担当者(I、1 、M){ ADDV(I + N、T、1 ); } 担当者(I、1 、N){ ADDV(S、I、RES)。 } 担当者(I、0、M- 1 ){ int型、U = VA [i]が1次回、V = VA [i]は.second。 ADDV(U、I + 1 + nは、1 )。 ADDV(V、I + 1 + nは、1 )。 } int型フロー= Dicnic()。 もし(フロー> = M){ 戻り 真。 } を返す 偽。 } int型のmain(){ ながら(〜のscanf(" %d個の%のD "、&N、&M)){ va.clear()。 S = 0、T = N + M + 1 。 担当者(I、1 、M){ int型Uを、V。 scanf関数(" %d個の%d個"、&U&V); va.push_back({U、V})。 } int型の L = 0、R = N +1、半ば、ANS = - 1 ; 一方、(L <= R){ 半ば =(L + R)>> 1 。 もし(チェック(MID)){ ANS = ミッド。 R =半ば1 。 } 他{ L =ミッド+ 1 。 } } チェック(ANS)。 printf(" %d個の\ n " 、ANS)。 INTの流れ= Dicnic()。 以下のための(int型のu = 1 ; U <= N; U ++ ){ ため(int型のI =ヘッド[U]は、I =! - 1 ; I = エッジ[I] .nxt){ 場合(エッジ[I] .flow == 0 &&エッジ[I ] .TO> N){ int型 ID =エッジ[I] .to- N。 INT X =(VA [ID- 1 ] 1次回== U VA [ID-?1 ] .second:VA [ID- 1 ] 1次回)。 printf(" %D%D \ n " 、U、X)。 } } } } }
私たちはn個の点の確立を考慮する必要があり、人に対応する各ポイントは、次に、m個の点を作成し、各点は、各個人が所有するれた関係、容量側のシンク1に接続されたそれぞれの関係に対応しますすべての関係は、このように、上記は、この条件が成立したと述べた製造、容量側1に接続されています。その後、我々は、各マップを再構築することができ、人々の流れに各ソースポイント仮想放射源点、2点を作成します。
最終的に出力方式は、プログラムの流出容量の各点は、0側です。