[POJ-2686] Traveling by Stagecoach(状压dp)

来源:互联网 发布:大数据魔方 编辑:程序博客网 时间:2024/05/17 07:57

题意:  现在有m个城市,n张车票,第i张车票有t[i]俩马车拉,给你一个图,从一个城市到另一个城市需要的用掉一张车票,所花费的时间是  dist[k][j]/t[i],问你从n城市到m城市的最小花费是多少?

思路:还是tsp问题,不过貌似 spfa可做?dp[i][j] 表示的是 你在第i个状态,第j张车票的时候所走过的最短路是多少,下面上代码吧 ,代码解释的很清楚。

#include <stdio.h>#include <string.h>#include <algorithm>#define inf 1000000007using namespace std;int t[33] , dist[111][111];double dp[1<<11][33];int main(){int n,m,p,a,b; //n张票 m个城市 p条道路 a起点 ,b终点while(scanf("%d%d%d%d%d",&n,&m,&p,&a,&b)!=EOF){memset(t,0,sizeof(t));memset(dist,0,sizeof(dist));if(n == 0 && m == 0 && p == 0 && a == 0 && b ==0) break;for(int i = 0 ; i < n ; i++){scanf("%d",&t[i]);}for(int i = 0 ; i < p ;i++){int ta,tb,tc;scanf("%d%d%d",&ta,&tb,&tc);dist[ta][tb] = tc;dist[tb][ta] = tc;}for(int i = 0 ; i < (1<<11) ; i++){for(int j = 0 ; j < 33;j++){dp[i][j] = inf;}}dp[0][a] = 0;for(int state = 0 ; state < (1<<n) ; state++)//当前状态 {for(int j = 1 ; j <= m ; j++)//当前在第j个城市 {for(int k = 0 ; k < n ; k++)//用到了第k张票 {if((1<<k)&state) continue;//第k张票没有用过 for(int i = 1 ; i <=m ; i++)//要走到第i个城市 {if(dist[i][j]) //如果可以走到第i个城市 {dp[(1<<k)|state][i] = min(dp[(1<<k)|state][i] , dp[state][j]+(double)dist[i][j]/t[k]);//走过第i个城市用掉第k张票的状态可以由他本身,或者是 他的上一个状态加上从第j个城市到第i个城市所用的时间 }}}}}double ans = inf;for(int i = 0 ; i < (1<<n) ; i++){ans = min(ans,dp[i][b]);}if(ans == inf){puts("Impossible");}else {printf("%.3f\n",ans);}}}


阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 百分九q版萌图 百分之九q版萌图 水浒108位好汉q版萌图 陈情令魏无羡q版萌图 魔道祖师简笔画q萌版 q讯空间 q讯家园 q讯 q讯主页 q讯家园看加密空间 q讯家园查看加密空间 q讯家园看加密空间3g 类似q讯家园的网站 q讯家园网址 q讯看加密空间 q迅家园 q迅 q迅首页 q迅家园账号 类似q迅家园的网站 q迅家园2018还能用吗 赵今麦生图q r9 r/ /r r- ,r r+ r, .r r. \'r r& r\' 高尔夫r 韩国r级 r左右 r左还是右 韩国r 欧拉r1