[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);}}}
阅读全文