いつの間にか難易度が★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相当なのかな。