题目链接: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