2686 Traveling by Stagecoach
問題概要
AOJに日本語の問題文があるのでそちら参照。
(http://rose.u-aizu.ac.jp/onlinejudge/ProblemSet/description.jsp?id=1138&lang=jp)
解法
AOJは拡張ダイクストラで通るがPKUだとTLEだった。
ビットDPの解法だと通った。
なんでこっちのほうが速いんだろ……グラフが密でlog nがかえって重くなっている感じだろうか。
ソースコード
int n,m,p,s,t,l[8]; vector<vector<pi> >e; double dp[30][1<<8]; int main() { while(scanf("%d%d%d%d%d",&p,&n,&m,&s,&t),s) { s--; t--; e.clear(); e.resize(n); rep(i,p)scanf("%d",l+i); rep(i,m) { int a,b,c; scanf("%d%d%d",&a,&b,&c); a--; b--; e[a].pb(mp(b,c)); e[b].pb(mp(a,c)); } rep(i,n)rep(j,1<<p)dp[i][j]=1e9; dp[s][(1<<p)-1]=0; for(int i=(1<<p)-1;i>0;i--)rep(j,n) { fr(k,e[j])rep(ii,p)if(i&1<<ii) dp[k->first][i^1<<ii]=min(dp[k->first][i^1<<ii],dp[j][i]+k->second*1.0/l[ii]); } double ans=1e9; rep(i,1<<p)ans=min(ans,dp[t][i]); if(ans==1e9)puts("Impossible"); else printf("%f\n",ans); } return 0; }