kmjp's blog

競技プログラミング参加記です

yukicoder : No.17 2つの地点に泊まりたい

いつの間にか難易度が★3になっていたので。
https://yukicoder.me/problems/no/17

問題

N頂点の無向グラフが与えられる。
辺にはコストが振られている。

0番の頂点から(N-1)番の頂点に移動する際、2つの異なる頂点に滞在したい。
そのような経路の最小コストを求めよ。

解法

Nはさほど大きくないので、まずWarshall-Floydで全頂点間のコストを求めよう。
あとは滞在する2頂点を総当たりすれば、O(N^3)で求められる。

int N,S[1001];
int M;
int mat[51][51];

void solve() {
	int i,j,k,l,r,x,y; string s;
	
	cin>>N;
	FOR(x,N) FOR(y,N) mat[x][y]=1<<27;
	FOR(x,N) mat[x][x]=0;
	FOR(x,N) cin>>S[x];
	cin>>M;
	FOR(i,M) {
		cin>>x>>y>>j;
		mat[x][y]=mat[y][x]=j;
	}
	FOR(i,N) FOR(j,N) FOR(k,N) mat[j][k]=min(mat[j][k],mat[j][i]+mat[i][k]);
	
	int mi=1<<27;
	for(x=1;x<N-1;x++) for(y=1;y<N-1;y++) if(x!=y)
		mi=min(mi,S[x]+S[y]+mat[0][x]+mat[x][y]+mat[y][N-1]);
	cout << mi << endl;
}

まとめ

Warshall-Floydがあると★3相当なのかな。