poj2686(Traveling by Stagecoach)状态压缩dp

Description

Once upon a time, there was a traveler.

He plans to travel using stagecoaches (horse wagons). His starting point and destination are fixed, but he cannot determine his route. Your job in this problem is to write a program which determines the route for him.

There are several cities in the country, and a road network connecting them. If there is a road between two cities, one can travel by a stagecoach from one of them to the other. A coach ticket is needed for a coach ride. The number of horses is specified in
each of the tickets. Of course, with more horses, the coach runs faster.

At the starting point, the traveler has a number of coach tickets. By considering these tickets and the information on the road network, you should find the best possible route that takes him to the destination in the shortest time. The usage of coach tickets
should be taken into account.

The following conditions are assumed.

  • A coach ride takes the traveler from one city to another directly connected by a road. In other words, on each arrival to a city, he must change the coach.
  • Only one ticket can be used for a coach ride between two cities directly connected by a road.
  • Each ticket can be used only once.
  • The time needed for a coach ride is the distance between two cities divided by the number of horses.
  • The time needed for the coach change should be ignored.

Input

The input consists of multiple datasets, each in the following format. The last dataset is followed by a line containing five zeros (separated by a space).

n m p a b

t1 t2 ... tn

x1 y1 z1

x2 y2 z2

...

xp yp zp

Every input item in a dataset is a non-negative integer. If a line contains two or more input items, they are separated by a space.

n is the number of coach tickets. You can assume that the number of tickets is between 1 and 8. m is the number of cities in the network. You can assume that the number of cities is between 2 and 30. p is the number of roads between cities, which may be zero.

a is the city index of the starting city. b is the city index of the destination city. a is not equal to b. You can assume that all city indices in a dataset (including the above two) are between 1 and m.

The second line of a dataset gives the details of coach tickets. ti is the number of horses specified in the i-th coach ticket (1<=i<=n). You can assume that the number of horses is between 1 and 10.

The following p lines give the details of roads between cities. The i-th road connects two cities with city indices xi and yi, and has a distance zi (1<=i<=p). You can assume that the distance is between 1 and 100.

No two roads connect the same pair of cities. A road never connects a city with itself. Each road can be traveled in both directions.

Output

For each dataset in the input, one line should be output as specified below. An output line should not contain extra characters such as spaces.

If the traveler can reach the destination, the time needed for the best route (a route with the shortest time) should be printed. The answer should not have an error greater than 0.001. You may output any number of digits after the decimal point, provided that
the above accuracy condition is satisfied.

If the traveler cannot reach the destination, the string "Impossible" should be printed. One cannot reach the destination either when there are no routes leading to the destination, or when the number of tickets is not sufficient. Note that the first letter
of "Impossible" is in uppercase, while the other letters are in lowercase.

Sample Input

3 4 3 1 4
3 1 2
1 2 10
2 3 30
3 4 20
2 4 4 2 1
3 1
2 3 3
1 3 3
4 1 2
4 2 5
2 4 3 4 1
5 5
1 2 10
2 3 10
3 4 10
1 2 0 1 2
1
8 5 10 1 5
2 7 1 8 4 5 6 3
1 2 5
2 3 4
3 4 7
4 5 3
1 3 25
2 4 23
3 5 22
1 4 45
2 5 51
1 5 99
0 0 0 0 0

Sample Output

30.000
3.667
Impossible
Impossible
2.856

Hint

Since the number of digits after the decimal point is not specified, the above result is not the only solution. For example, the following result is also acceptable.

30.0
3.66667
Impossible
Impossible
2.85595

题意:m个城市,p条路,告诉你每条路长度,给你n张车票,每张车票都有一个车速。一条路必须要用掉一张车票,时间为距离/车速。求从a到b所需的最短时间。

题解:状态压缩dp,dp[s][v]表示还剩的车票集合为s,在v城市时最短时间,那么

dp[s][v] = min{ dp[s-{i}][u] + d(v, u) }

#include <iostream>
#include <sstream>
#include <fstream>
#include <string>
#include <map>
#include <vector>
#include <list>
#include <set>
#include <stack>
#include <queue>
#include <deque>
#include <algorithm>
#include <functional>
#include <iomanip>
#include <limits>
#include <new>
#include <utility>
#include <iterator>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <cmath>
#include <ctime>
using namespace std;

const int INF = 0x3f3f3f3f;
const int maxn = 10;
const int maxm = 35;

double dp[(1<<maxn)-1][maxm];
int d[maxm][maxm];
int t[maxn];
int vis[maxm];
int n, m, p, a, b;

double rec(int s, int v)
{
    vis[v] = 1;
    if (dp[s][v] >= 0)
        return dp[s][v];
    if (v == b)
        return dp[s][v] = 0;
    double res = INF;
    for (int u = 0; u < m; ++u)
        for (int i = 0; i < n; ++i)
            if (u != v && !vis[u] && (1<<i)&s && d[u][v] < INF)
            {
                vis[u] = 1;
                res = min(res, rec((1<<i)^s, u)+d[v][u]*1.0/t[i]);
                vis[u] = 0;
            }
    return dp[s][v] = res;
}

int main()
{
    while (cin >> n >> m >> p >> a >> b && (n || m || p || a || b))
    {
        a--;
        b--;
        for (int i = 0; i < n; ++i)
            scanf("%d", &t[i]);
        fill(d[0], d[m], INF);
        fill(vis, vis+m, 0);
        fill(dp[0], dp[1<<n], -1);
        while (p--)
        {
            int x, y, dis;
            scanf("%d%d%d", &x, &y, &dis);
            d[x-1][y-1] = d[y-1][x-1] = dis;
        }
        double ans = rec((1<<n)-1, a);
        if (fabs(ans-INF) < 1e-8)
            printf("Impossible\n");
        else
            printf("%.3f\n", ans);
    }
    return 0;
}

版权声明:本文为博主原创文章,转载请注明出处。

时间: 2024-10-10 12:50:39

poj2686(Traveling by Stagecoach)状态压缩dp的相关文章

北大ACM2686——Traveling by Stagecoach~~状态压缩DP

最近才看书,看到状态压缩.对于状态压缩DP,其实就是集合上的DP. 这需要我们了解一些位运算: 集合{0,1,2,3,....,n-1}的子集可以用下面的方法编码成整数 像这样,一些集合运算就可以用如下的方法来操作: 1.空集....................0 2.只含有第i个元素的集合{i}................1 << i 3.含有全部n个元素的集合{0,1,2,3,....,n - 1}.............(1 << n) - 1 4.判断第i个元素是

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

Traveling by Stagecoach Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 2776   Accepted: 996   Special Judge Description Once upon a time, there was a traveler. He plans to travel using stagecoaches (horse wagons). His starting point and

Traveling by Stagecoach 状态压缩裸题

Traveling by Stagecoach dp[s][v]  从源点到达  v,状态为s,v的最小值.  for循环枚举就行了. 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <algorithm> 6 #include <string> 7 #include <vector>

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

状态压缩DP和普通DP唯一的区别就是它所枚举的对象不再是一个整数,而是一个集合,解决的策略就是利用二进制将这个集合压缩成一个整数. 对于该题,dp[s][v]表示:s表示在该城市剩下的车票集合,v表示在城市v,dp表示在该状态的最小话费. 影响决策的因素有一下几个: 1.一共使用哪几个车票(包括数量和种类) 2.当前从哪个城市到哪个城市 3.使用哪个车票完成两个城市的转移 所以一共需要枚举4个量,用4重循环完成状态转移. #include<cstdio> #include<cstring

POJ 3254 Corn Fields 状态压缩DP (C++/Java)

http://poj.org/problem?id=3254 题目大意: 一个农民有n行m列的地方,每个格子用1代表可以种草地,而0不可以.放牛只能在有草地的,但是相邻的草地不能同时放牛, 问总共有多少种方法. 思路: 状态压缩的DP. 可以用二进制数字来表示放牧情况并判断该状态是否满足条件. 这题的限制条件有两个: 1.草地限制. 2.相邻限制. 对于草地限制,因为输入的时候1是可以种草地的. 以"11110"草地分析,就只有最后一个是不可以种草的.取反后得00001  .(为啥取反

HDU1565(状态压缩dp)

方格取数(1) Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 8170    Accepted Submission(s): 3095 Problem Description 给你一个n*n的格子的棋盘,每个格子里面有一个非负数.从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取的数所在的2个格子不能相邻,并且取出的数

HDU 3001【状态压缩DP】

题意: 给n个点m条无向边. 要求每个点最多走两次,要访问所有的点给出要求路线中边的权值总和最小. 思路: 三进制状态压缩DP,0代表走了0次,1,2类推. 第一次弄三进制状态压缩DP,感觉重点是对数据的预处理,利用数组分解各个位数,从而达到类似二进制的目的. 然后就是状态的表示,dp[s][i]表示状态s时到达i的最优值. 状态转移也一目了然,不废话. #include<stdio.h> #include<string.h> #include<algorithm> u

Victor and World(spfa+状态压缩dp)

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5418 Victor and World Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/131072 K (Java/Others)Total Submission(s): 958    Accepted Submission(s): 431 Problem Description After trying hard fo

poj 3311 Hie with the Pie(状态压缩dp)

Description The Pizazz Pizzeria prides itself in delivering pizzas to its customers as fast as possible. Unfortunately, due to cutbacks, they can afford to hire only one driver to do the deliveries. He will wait for 1 or more (up to 10) orders to be