Time Limit: 0 msec / Memory Limit: 256 MB
今日, 急激に経済発展しているK国で国際情報オリンピックが開かれることになった. K国では既に国際数学オリンピックが開催されていたのだが, その時は大会期間中にK国側のミスによって選手が乗ったバスをIMO[1]させてしまった. 選手を二度もIMOさせることは開催国として恥ずかしいことなので, 国際情報オリンピックでは絶対に選手をIMOさせないために対策を練ることになった.
K国では国際情報オリンピックに使用する土地として N 個の都市を使用する. N 個の都市は M 本の道で結ばれており, それらの道は両方向に通行可能である. どの道も異なる2つの都市を結んでおり, 道同士が都市以外の地点で交わることはない. また, K国の都市は全て数字で管理されている.
過去にIMOさせた原因を調査した結果, バスの移動中に運転手が都市の数字を読み間違えたことが原因であることが分かった. そのため今回の大会では読み間違いを少なくするため, 都市の番号をある程度わかりやすい順にして運転中にチェックしやすくなるようにすることにした. 具体的にはバスが巡ることが可能な経路, つまり幾つかの道を辿って都市をめぐる経路における, 経路上の都市の番号は常に単調増加または単調減少になるようにすることである. 大会のスケジュールは未定なのでバスの経路は全て考えなければならない. ただしバスの経路として同じ都市を複数回巡る経路は考えない. この条件を満たしたK国の状態を「良いK国の状態」と呼ぶことにする. バスの経路が存在しない場合もK国は「良いK国の状態」である.
しかし, 都市の番号は国民が慣れ親しんだものなので容易に変えることはできない. 議会での度重なる討論の結果, 1日に1回, ある1本の道上の2都市間の数字を入れ替えることのみが認められることになった. 大会開催までにはあまり時間がないので, できるだけ短い日数で「良いK国の状態」にしなければならない.
なお, この文章は事実を基にしたフィクションであり, K国は代表選手が友好的なあの国のことではない.
[1] IMOとは, 「国際道迷いオリンピック」というスラングのことで, 本文中では「国際大会で迷子になる」と解釈する.
課題
都市と道の情報が与えられたとき, 道の両端の都市の番号を入れ替える操作を繰り返して, どの単純な経路もその経路上の都市の番号が昇順または降順である状態にするのに必要な操作回数 ( K国を「良いK国の状態」にするために必要な日数 ) の最小値を計算せよ.
次のパラメータをもつプロシージャ best_swap(N,M,E) を実装せよ:
- N -- 都市の個数. 都市には 0 から N-1 までの番号がつけられている.
- M -- 道の本数. 道には 0 から M-1 までの番号がつけられている. 各々の道は 2 つの異なる都市を結んでおり, 結んでいる都市の対が同じ道が複数存在することもある(14:07 追記)
はどの道についても異なる. - E -- 道の情報を表す 2 次元配列. 0 ≦ i < M に対し, 道 i は都市 E[i][0] と E[i][1] を結んでいる.
best_swap(N,M,E) は必要な操作回数の最小値を返さなければならない. どのように交換してもK国が条件を満たすことができない場合は -1 を返す必要がある.
例
例1
例として N = 3, M = 2,
E = | 0 | 2 | |
1 | 2 |
の場合を考える. この場合, 都市 1 と都市 2 の番号を入れ替えることで「良いK国の状態」になるので best_swap(N,M,E) は 1 を返す必要がある.
例2
例として N = 3, M = 3,
E = | 0 | 1 | |
1 | 2 | ||
0 | 2 |
の場合を考える. この場合, どのように交換しても 0,2,1 と巡る経路が存在するため, K国は「良いK国の状態」になることができない. よって best_swap(N,M,E) は -1 を返す必要がある.
例3
例として N = 6, M = 8,
E = | 0 | 1 | |
3 | 2 | ||
1 | 2 | ||
4 | 5 | ||
5 | 2 | ||
3 | 0 | ||
2 | 4 | ||
5 | 4 |
の場合を考える. この場合も best_swap(N,M,E) は -1 を返す必要がある.
小課題
小課題 1 (10 点)
- 1 ≦ N ≦ 1 000
- M = N-1
- K国は最も単純な直線の形状である. どの2つの都市についてもそれらを結ぶ経路が存在し,かつ,出ている道の本数が1本であるような都市は2個以下である.
小課題 2 (44 点)
- 1 ≦ N ≦ 100 000
- M = N-1
- K国は最も単純な直線の形状である. どの2つの都市についてもそれらを結ぶ経路が存在し,かつ,出ている道の本数が1本であるような都市は2個以下である.
小課題 3 (46 点)
- 1 ≦ N ≦ 100 000
- 0 ≦ M ≦ 200 000
実装の詳細
制限
- CPU 時間制限: 1 秒
- メモリ制限: 256 MB
注意: スタックのサイズには決められた制限はない。スタックとして使用されたメモリは、メモリ総使用量に含まれる。
インターフェース (API)
- 実装フォルダ: imo/ (プロトタイプ: imo.zip)
- 競技者が実装するファイル: imo.cpp
- 提出ファイルのインターフェース: imo.h
- 採点プログラムのサンプル: grader.cpp
- 採点プログラムの入力のサンプル: grader.in.1, grader.in.2, ...
注意:採点プログラムのサンプルは次の書式の入力を読み込む。- 1 行目: N の値と M の値
- 2 行目から M+1 行目: 道の情報. つまり,0 ≦ i < M に対し, i+2 行目には E[i][0] と E[i][1] が空白区切りで書かれている.
- 採点プログラムの入力のサンプルに対して期待される出力: grader.expect.1, grader.expect.2, ...
注意:採点プログラムのサンプルは次の書式の出力を書き出す。- best_swap(N,M,E) の返り値である1つの整数