POJ2686-Traveling by Stagecoach

原创 2016年08月28日 20:40:13

状态压缩dp,将n张马票看作n种状态进行状态压缩。
s代表到达剩下的车票集合,v代表现在所在的城市。
d[s][v]表示所需的最小费用。
这样一来,dp[s{i}][u] = min(dp[s{i}[u], dp[s][v] + d[v][u] / t[i])

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int maxn = 8;
const int maxm = 30;
const int inf = 1234;

int n, m, p, a, b;

int t[maxn+2];
int d[maxm+2][maxm+2];

double dp[1<<maxn][maxm];

double min(double a, double b) {
    return a < b ? a : b;
}

int main(int argc, char const *argv[]) {
    while (scanf("%d%d%d%d%d", &n, &m, &p, &a, &b) == 5 && n + m + p + a + b) {
        a--, b--;
        for (int i = 0; i < n; i++) {
            scanf("%d", &t[i]);
        }
        memset(d, -1, sizeof(d));
        for (int i = 0; i < p; i++) {
            int x, y, z;
            scanf("%d%d%d", &x, &y, &z);
            x--, y--;
            d[x][y] = d[y][x] = z;
        }

        for (int i = 0; i < (1 << n); i++) {
            fill(dp[i], dp[i] + m, inf);
        }
        dp[(1<<n)-1][a] = 0;

        for (int s = (1 << n) - 1; s >= 0; s--) {
            for (int v = 0; v < m; v++) {
                for (int i = 0; i < n; i++) {
                    if (s >> i & 1) {
                        for (int u = 0; u < m; u++) {
                            if (d[v][u] >= 0) {
                                dp[s-(1<<i)][u] = min(dp[s-(1<<i)][u],
                                    dp[s][v] + (double)d[v][u] / t[i]);
                            }
                        }
                    }
                }
            }
        }
        double res = inf;
        for (int s = (1 << n) - 1; s >= 0; s--) {
            res = min(res, dp[s][b]);
        }
        if (res == inf) {
            printf("Impossible\n");
        } else {
            printf("%.3f\n", res);
        }
    }
    return 0;
}

POJ 2686 Traveling by Stagecoach (状态压缩DP)

Traveling by Stagecoach Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 2776   Ac...
  • a2459956664
  • a2459956664
  • 2016年05月05日 14:45
  • 1240

POJ-2686-Traveling by Stagecoach

求a到b的最小花费,其中加了一些其他的因素,比如可以坐马车。 用动态规划和状态压缩就可以解决,每次的状态值需要记录到达某地和所剩的票数 代码: #include #include #includ...
  • z309241990
  • z309241990
  • 2014年03月31日 20:05
  • 794

POJ2686--Travelling by Stagecoach

题目大意:m个城市,p条双向路,n张车票,上面记录着马的数量,从一个城市到另一个城市都需要用车票,时间为,两个城市之间道路的长度除以车票上马的数量。求从城市a到城市b的最短时间,无法到达输出Impos...
  • hhhhhhj123
  • hhhhhhj123
  • 2015年08月26日 22:16
  • 165

POJ 2686 Traveling by Stagecoach

//状态压缩实际上是将一个集合用一个数来表示 #include #include #include using namespace std; #define INF 1...
  • lj94093
  • lj94093
  • 2014年11月08日 16:58
  • 351

Traveling by Stagecoach POJ - 2686

状态压缩DP 题目描述:旅行商要从a城市到b城市,它共有n张马车票,一共有p条道路,m个城市,每两个城市之间花费的时间是道路之间的距离除以马车的数量,求最小的花费时间。 解题分析:关键还是在于怎么...
  • Mrhanice
  • Mrhanice
  • 2017年08月31日 10:48
  • 99

poj 2686 Traveling by Stagecoach

#include int d[32][32]; int t[10]; double dp[1
  • sky_zdk
  • sky_zdk
  • 2017年03月10日 20:20
  • 132

poj 2991 Traveling by Stagecoach

poj Traveling by Stagecoach
  • tengfei461807914
  • tengfei461807914
  • 2016年07月16日 11:23
  • 220

poj2686Traveling by Stagecoach状态压缩dp

#include #include #include #include using namespace std; const int MAXN = 35; const double INF = 0x3...
  • Rain722
  • Rain722
  • 2016年09月07日 20:52
  • 328

193_Travelling by Stagecoach (POJ 2686)

单源最短路径的变种,加上了限制条件:乘客手中又n张票,每张票都记有几匹马,而从一点到另外一点的开销为路径/马匹数,票用完没到终点就算失败。  求最短开销。  做法是定义状态转移矩阵dp[S][v]...
  • qq_31552435
  • qq_31552435
  • 2016年01月21日 09:28
  • 216

poj2686Traveling by Stagecoach(状态压缩)

Traveling by Stagecoach Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 2487   Ac...
  • acm_fighting
  • acm_fighting
  • 2015年09月17日 14:36
  • 215
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ2686-Traveling by Stagecoach
举报原因:
原因补充:

(最多只允许输入30个字)