状压DP裸题,将({当前车票集合},当前顶点)这样一个二元组当成状态,然后 边权/马匹 当成边长,跑最短路或者DAG上的DP即可。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef double db;
#define INF 2147483647.0
int n,m,K,Sta,End;
int hor[9];
int e,v[1801],first[31],next[1801],w[1801];
void AddEdge(int U,int V,int W)
{
v[++e]=V;
w[e]=W;
next[e]=first[U];
first[U]=e;
}
db f[1<<9][31];
int main()
{
int x,y,z;
while(1)
{
scanf("%d%d%d%d%d",&K,&n,&m,&Sta,&End);
if(!n) break;
memset(first+1,0,sizeof(int)*n);
e=0;
for(int i=0;i<K;++i)
scanf("%d",&hor[i]);
for(int i=0;i<m;++i)
{
scanf("%d%d%d",&x,&y,&z);
AddEdge(x,y,z);
AddEdge(y,x,z);
}
for(int i=0;i<(1<<K);++i)
for(int j=1;j<=n;++j)
f[i][j]=INF;
f[(1<<K)-1][Sta]=0.0;
for(int i=(1<<K)-1;i>=0;--i)
for(int j=1;j<=n;++j)
for(int k=0;k<K;++k)
if(i>>k&1)
for(int l=first[j];l;l=next[l])
f[i-(1<<k)][v[l]]=min(f[i-(1<<k)][v[l]],f[i][j]+(db)w[l]/(db)hor[k]);
db ans=INF;
for(int i=0;i<(1<<K);++i)
ans=min(ans,f[i][End]);
if(ans<INF)
printf("%.3f\n",ans);
else
puts("Impossible");
}
return 0;
}

最新文章

  1. django 过滤器、日日期格式化参数
  2. 4Sum
  3. BZOJ 2433 智能车比赛(计算几何+最短路)
  4. Oracle -&gt;&gt; 变量赋值 Demo
  5. 以NameValueCollection 修改URL中的查询参数
  6. mysqldump批量导出(多张表)表结构及表数据
  7. linux共享windows资料
  8. C语言:Message类
  9. uva 755 - 487--3279
  10. Highcharts 时间序列,可缩放的图表
  11. properties读取的几种方法
  12. 修改config.php配置
  13. ASP.NET脚本过滤-防止跨站脚本攻击(收集别人的)
  14. 微软移除WIN10密码过期政策Microsoft Removes Password-Expiration Policy in Windows 10
  15. bootstrap中的明星属性
  16. 提取路由器固件中的squashfs
  17. 手工搭建web项目
  18. pycharm更新之后显示问题
  19. The file left unchanged.
  20. Linux声卡驱动框图

热门文章

  1. 一个JavaScript反射使用的例子
  2. taotao订单系统
  3. hadoop SecondNamenode 详解
  4. [poj 3252]数位dp前导0的处理
  5. Kafka自我学习-报错篇
  6. COGS2090 Asm.Def找燃料
  7. HTML5之FileReader的简易使用
  8. bzoj 3190 维护栈
  9. 【eclipse使用git】eclipse使用私钥提交项目
  10. 获取span中的值