求a到b的最小花费,其中加了一些其他的因素,比如可以坐马车。
用动态规划和状态压缩就可以解决,每次的状态值需要记录到达某地和所剩的票数
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn=1<<10;
const int maxm=31;
const int inf=1<<29;
int n,m,p,a,b,map[maxm][maxm],t[maxm];
double dp[maxn][maxm];
int main()
{
while(scanf("%d%d%d%d%d",&n,&m,&p,&a,&b)!=EOF)
{
if(!n&&!m)
break;
memset(map,0,sizeof(map));
for(int i=0;i<n;i++)
scanf("%d",&t[i]);
for(int i=0;i<p;i++)
{
int u,v,c;
scanf("%d%d%d",&u,&v,&c);
map[u][v]=map[v][u]=c;
}
for(int i=0;i<(1<<n);i++)
fill(dp[i],dp[i]+m+1,inf);
dp[(1<<n)-1][a]=0;
for(int i=(1<<n)-1;i>=0;i--)
{
for(int u=1;u<=m;u++)
for(int j=0;j<n;j++)
if(i&(1<<j))
for(int v=1;v<=m;v++)
if(map[u][v])
{
dp[i^(1<<j)][v]=min(dp[i^(1<<j)][v],dp[i][u]+map[u][v]*1.0/t[j]);
}
}
double ans=inf;
for(int i=0;i<(1<<n);i++)
ans=min(ans,dp[i][b]);
if(ans==inf)
printf("Impossible\n");
else
printf("%.3f\n",ans);
}
return 0;
}