SRM 583 DIV1 Easy - TravelOnMars (復習x)

問題


都市が円状につながっている。
各都市には、そこから1ターンでいける都市数が保存されている。
始点と終点が与えられた時、移動するための最小ターン数を求める。

解き方


グラフの最短距離を求める問題なので、ワーシャルフロイド法が使えないか考える。
グラフを作成し、隣り合う都市は1、そこから1ターンで行ける都市は1とし、
最後にワーシャルフロイドを走らせる。

Challenge
一方向だけではなく、順と逆を組み合わせてもよいことに注意。

コード


class TravelOnMars {

public: int minTimes(vector<int> range, int startCity, int endCity) {
int n=range.size(),INF=100000000;
int dp[n][n];

FORE(i,0,n)FORE(j,0,n)dp[i][j]=INF;
FORE(i,0,n){
FORE(j,0,n){
int l=(i-j+n)%n;
int r=(j-i+n)%n;
if(min(l,r)<=range[i])dp[i][j]=1;
}
}

FORE(k,0,n)FORE(i,0,n)FORE(j,0,n)dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]);

return dp[startCity][endCity];
}

};
このエントリーをはてなブックマークに追加