プログラミングコンテストの質問を受けたところ、絶対に爆撃しました。入力セットを読んだ最初の段階で問題が発生しました。質問は基本的にこのパズルの変形でした http://codercharts.com/puzzle/evacuation-plan だけでなく、最初の行に1時間の要素がありました(たとえば、避難開始から3時間後)。このように読みます
このパズルは、日本の地震で苦しんだすべての人々へのオマージュです。このパズルの目標は、道路と場所のネットワークを前提として、避難できる最大人数を決定することです。
人々は避難場所から救助場所に避難しなければなりません。道路のリストと1時間あたりに運ぶことができる人数が表示されます。
入力仕様プログラムは、入力ファイルという1つのコマンドライン引数のみを受け入れる必要があります。入力ファイルの形式は次のとおりです。最初の行には4つの整数が含まれますnrstnは場所の数です(各場所は0からn-1までの数字で指定されます)rは道路の数ですsは避難する場所の数ですfrom(避難ポイント)tは、人々が(救助ポイント)に避難しなければならない場所の数です。2行目には避難ポイントの場所を示すs整数が含まれ、3行目には次のrに続く救助ポイントの場所を示すt整数が含まれます。線には道路の定義が含まれています。各道路は3つの整数l1l2幅で定義されます。ここで、l1とl2は道路で接続された場所であり(道路は片道です)、幅は道路に収まる1時間あたりの人数です。
次に、サンプル入力セットを見てください
5 5 1 2 3
0
3 4
0 1 10
0 2 5
1 2 4
1 3 5
2 4 10
最初の行の3は追加コンポーネントであり、リソースが開始されてからの時間数として定義されます。この場合は3です。
私の解決策は、Dijisktrasアルゴリズムを使用して、レスキューノードとevacノードのそれぞれの間の最短パスを見つけることでした。今、私の問題は入力セットの読み方から始まりました。 pythonの最初の行を読み、値を変数に格納しました。しかし、ノード間の距離の値を格納する方法と、使用するDSと、それを入力してdijikstrasアルゴリズムの標準実装を言う方法がわかりませんでした。
だから私の質問は2つあります1.)そのような問題の入力をどのように取るのですか? -最近、かなりの数のコンテストでこの問題に直面しました。Javaまたはpythonで簡単なコードスニペットまたは説明を取得して、データ入力セットを可能な方法で読み取ることができるといいのですが。 dijikstraやfloyd/warshallなどのグラフアルゴリズムにグラフとして入力します。また、上記の問題の解決策も役立ちます。
2.)このパズルを解く方法は?私のアルゴリズムは次のとおりです。
避難ポイント間の最短経路を見つけます(上記の例では、0から3までは14です)これに時間数を掛けて、最大の保存数を取得します。また、入力セットのバリアントに対して与えられた答えは24でしたが、私にはわかりません。誰かがそれも説明できますか?.
更新:
与えられた問題リンクで答えが14であることがわかります。これは、ノード0と3の間の最短経路のようです。しかし、3時間のコンポーネントでは、答えは24です。
更新
私はそれが24である方法を取得します-毎時の完全グラフトラバーサルとこれが私がそれを解決する方法です
Hour 1
Node 0 to Node 1 - 10 people
Node 0 to Node 2- 5 people
TotalRescueCount=0
Node 1=10
Node 2= 5
Hour 2
Node 1 to Node 3 = 5(Rescued)
Node 2 to Node 4 = 5(Rescued)
Node 0 to Node 1 = 10
Node 0 to Node 2 = 5
Node 1 to Node 2 = 4
TotalRescueCount = 10
Node 1 = 10
Node 2= 5+4 = 9
Hour 3
Node 1 to Node 3 = 5(Rescued)
Node 2 to Node 4 = 5+4 = 9(Rescued)
TotalRescueCount = 9+5+10 = 24
この場合、複数の避難ポイントと救助ポイントについては、世界でどのようにこれのpgmを書くのでしょうか?
この質問は基本的に2つあります。
最初の質問は少し狭いですが、長期的には2番目の質問の方が興味があるようです。だから、私はあなたに フローアルゴリズム を指摘させてください。実装の複雑さという点ではダイクストラからの一歩ですが、すでにお気づきのように、単一のパスでできることはたくさんあります。ネットワークフローはまったく別のものです。
入力の読み取りに関しては、使用するグラフライブラリの種類によって大きく異なります。数年前、私がこれらのコンテストに参加していたとき、サードパーティのライブラリを使用することは許可されていなかったため、独自の実装を展開する必要がありました。
その場合、完全なマトリックスを読みたいのか、グラフを隣接リストとして保持したいのかを前もって考える必要があります。これらは、グラフアルゴリズムについて知っておくべき2つの最も重要なデータ構造です。 (より正確には、問題の入力仕様がどちらか一方に指示するため、多くの場合、先を考える必要はありません)
隣接行列の入力の読み取りは、2つのネストされたforループと同じくらい簡単です。内側のループの本体では、1つの値を読み取り、それを1つのマトリックスセルに割り当てるだけです。完了。
隣接リストの場合、ノードごとにノードのネイバーのリストを準備する必要があります。つまり、n
ノードの場合、各エントリの空のリストを含むサイズn
のリストを準備します。次に、2つのネストされたforループがあります。外側のループはノードを通過し、内側のループはそのノードの隣接ノードを読み取り、対応する内側のリストに追加します。 Voila-グラフの隣接リスト表現。
プログラミングの課題/競争のための重要な追加:あなたが競争について考える前に両方のバリアントを書く方法を夢の中で知っていることを確認してください。そこには無限のサンプルの質問と練習サイトがあります。グラフ入力の問題を探し回ってから、入力コードを何度も書き直してください。ほとんどの場合、ほぼ同じコードである必要があります。慣れると、上記のような入力を読み取るのに最大5分かかります。その分野で本当に強いプレーヤーと競争したい場合は、約1分以内にこのための入力読み取り値をコーディングできるはずです。