TopCoder SRM 551 Div1 Medium ColorfulWolves

問題

有向グラフが与えられる。
0番の頂点から出発して、
枝の出ている頂点のうち、もっとも番号の小さい頂点に移動することを繰り返す。


この移動で、n-1番の頂点にいけるように、
枝を好きに削除することができる。
削除しなければならない枝の本数の最小値を求めよ。


どうやってもn-1番の頂点にいけないとき、-1を出力せよ。

制約条件

n≦50

方針

bitwise2013に全く同一の問題が出ていた。
i番目の頂点にいるとき、j番目に小さい頂点に行きたいなら、
j本の枝を消す必要があるので、コストがjかかる。
これまでに行った頂点には、もう一度行くと無限ループするので行けないようにする必要がある。


この重みつきグラフ上でダイクストラ法をすればよい。

ソースコード

class ColorfulWolves {
	public:
	int getmin(vector <string> colormap) {
		int n = colormap.size();
		bool dp[50] = {};
		vector<vi> e(n);
		
		rep(i, n) rep(j, n) if(colormap[i][j] == 'Y') e[i].pb(j);
		priority_queue<pi> q;
		q.push(mp(0, 0));
		
		while(!q.empty()){
			int c = q.top().second, d = -q.top().first;
			q.pop();
			if(dp[c]) continue;
			dp[c] = 1;
			if(c == n - 1) return d;
			
			rep(i, e[c].size()) q.push(mp(-d - i, e[c][i]));
		}
		return -1;
	}
};