728 [24ネットワークフロー問題】最小パスカバレッジの問題を
★★★☆入力ファイル:path3.in
出力ファイル:path3.out
評価プラグインの
制限時間:1■メモリーの上限:128メガバイト
-
アルゴリズム最短経路問題8-3カバー問題(8-13演習)
「問題の説明:
-
有向グラフG =(V、E)指定されました。Pは、単純なパスG(頂点互いに素)Aの集合とします。Vそれぞれの場合
-
頂点Pは、パスP Gカバレッジと呼ばれ、ただ1つの方法です。Vの頂部Pから任意の経路
-
ポイントは、長さは任意であり、具体的には、ゼロであってもよいです。GはGの最小数を含んでいた最小パスカバレッジ経路であります
-
パスカバレッジ。
-
経路非循環グラフGに最小カバレッジのための効率的なアルゴリズムの設計
ヒント:
集合V = {1,2、...、n}は、ネットワーク・コンフィギュレーション・G1 =(V1、E1)を以下のように:
-
図1は、各エッジの容量です。G1は、ネットワーク(X0、Y0)の最大流量を求めています。
「プログラミングタスク:
-
所与の非循環有向グラフGについて説明するために、Gは、最小のパスカバレッジを識別するようにプログラム。
「入力データ:
-
ファイルINPUT.TXTからの入力データを提供します。ファイル1行は、2つの正の整数nとmを持っています。nが与えられた非循環有向グラフであります
-
Gの頂点の数、mはGのエッジの数であります 次のm行、各行は2つの正の整数iおよびjを有する、有向エッジ(i、j)を表します。
「出力結果:
-
実行が終了すると、output.txtとのファイルパスカバレッジの最小出力。最初の行から開始し、各出力線
パス。ファイルの最後の行には、パスの最小数です。
入力ファイルの例
-
INPUT.TXT
11 12 1 2 1 3 1 4 2 5 3 6 4 7 5 8 6 9 7 10 8 11 9 11 10 11
出力ファイルの例
output.txtと
1 4 7 10 11 2 5 8 3 6 9 3
説明:
コーディング!
彼は自身が弱すぎました
これは、問題をカバーする比較的単純な二部グラフの最短パスが間違っああを行くことができるようです
誤りがちなポイントと今、私たちはの質問について話しています
1.番号が最小のパスカバレッジノードであるN - マッチ二部グラフの最大数
2.質問は、出力パスを許可し、それはそれを行うにはどのようにすべきですか?
私はこのようにするための方法を考えました
まず、我々は大きな列挙に小さな累積時間ANSがないことを一度にハンガリーDFSアルゴリズムを実行しているノードを列挙します
これは、通常の状況下で、そのHAVアレイは、[インクルード] =肝炎[前]肝炎されると言うことですが、これは、我々は、私が傷を付けているため、出力パスを比較したい方法ではありません場合は(小)は出力を開始します
その後、我々は息子の配列を見ることができ、配列は、HAVの周りだけで、他の方法です。
私たちは、その後、保存するために、アレイ内の度合いを設定しました
したがって、上記の処理後
私達はちょうど、我々は息子がこれ以降から走った、道をプリントアウトすることができますダウンし始めるこの点は0度の場合のn点を列挙する必要があります
(実際にはそんなに私はまだそれより明確にコードビットを見て長期ったらしい非常に簡単です)少し具体的な内容を理解するためのコードを見てください
傑作:
<ビット/ STDC ++ H>の#include の#define MAXN 205 使用して 名前空間STDを、 INTのN、M。 int型 VIS [MAXN]、[MAXN]、ティム=肝炎0 。 ベクター < INT > [MAXN] V。 int型 で、[MAXN] int型の息子[MAXN]。 BOOLのDFS(INT X) { ため(int型 i = 0 ; iはV <[X] .size(); iは++ ) { int型、Y = V [X] [I]; もし(VIS [Y]!= TIM) { VIS [Y] =ティム; 場合には(![Y] ||肝炎のDFS(HAV [Y])) { 肝炎[Y] =のXと、 息子[X] = Y。 で [Y] ++ ; 返す 真; } } } を返す 偽。 } BOOL プリント[MAXN]。 ボイドプリント(int型I) { int型、X = I。 一方、(X!= 0 ) { のprintf(" %dの"、バツ); 印刷された[X] = 真。 X = 息子[X]。 } のputchar(' の\ n ' ); } int型のmain() { freopenは(" path3.in "、" R " 、STDIN)。 freopenは(" path3.out "、" W " 、STDOUT)。 scanf関数(" %d個の%のD "、&N、&M)。 用(int型 I = 1、X、Y、I <= M。) scanf関数(" %dの%のD "、およびX&Y)。 V [X] .push_back(Y)。 } INT ANS = 0 。 以下のために(int型私= 1 ; iが<= N; iが++ ) { ティム ++ 。 ANS + = のDFS(I)。 } のために(int型 I = 1を iが++; iが<= N ) 場合(で、[I] == 0 ) プリント(I)。 printf(" %d個の\ n " 、N-ANS)。 リターン 0 ; }
徒歩Zangaフォロワー聖歌を指します