首页 > 其他 > 详细

poj2686 Traveling by Stagecoach

时间:2020-09-12 18:53:54      阅读:52      评论:0      收藏:0      [点我收藏+]

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!