题目链接:https://vjudge.net/problem/POJ-2686
题意:无向图,路上需要车票。现在有k张车票,每张车票有限速。在一条路上的耗时为 长度/限速。求出从a到b的最小时间
基本就是tsp问题。设f[v][s]表示到达顶点v,使用车票的状态为s。则有f[v][s]=min(f[v][s],f[u][s‘]+d[u][v]/vi)
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; int t[10],d[40][40],k,m,n,a,b,u,v,i,j,s; double f[40][(1<<10)]; int main(){ while (scanf("%d%d%d%d%d",&k,&m,&n,&a,&b)){ if (!(k|m|n|a|b)) break; for (i=0;i<k;i++) scanf("%d",&t[i]); memset(d,0,sizeof(d)); for (i=1;i<=m;i++) for (j=0;j<(1<<10);j++) f[i][j]=1e9; for (i=1;i<=n;i++){ int x,y,w; scanf("%d%d%d",&x,&y,&w); d[x][y]=d[y][x]=w; } f[a][0]=0; //* for (s=0;s<(1<<k);s++) //* for (i=0;i<k;i++) if (s&(1<<i)){ int st=s^(1<<i); for (v=1;v<=m;v++) for (u=1;u<=m;u++) if (d[u][v]>0) f[v][s]=min(f[v][s],f[u][st]+(double)d[u][v]/t[i]); //* } double ans=1e9; for (s=0;s<(1<<k);s++) ans=min(ans,f[b][s]); if (ans==1e9) printf("Impossible\n"); else printf("%.3f\n",ans); } return 0; }
poj2686 Traveling by Stagecoach
原文:https://www.cnblogs.com/edmunds/p/13657853.html