标签:rri example 最短路 sid dag fill input info ror
| Time Limit: 2000MS | Memory Limit: 65536K | |||
| Total Submissions: 3407 | Accepted: 1322 | Special Judge | ||
Description
Input
Output
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
30.0 3.66667 Impossible Impossible 2.85595
题目链接:POJ 2686
刷白书上的题目看到的,由于一条边只能走一次,在DAG的最短路中本来就是只走一次,那么只要再用一个状态表示走到某一个点用了哪些车票就好了。
用dis[v][S]表示走到v这个点,n张车票使用状态为S,显然一开始在点a,用了0张车票,因此初始状态为(a, 0),然后SPFA之后根据$[dis[b], dis[b] + (1 << n) - 1]$中的最小值判断即可,一开始边数写小了RE了几次……
代码:
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <sstream>
#include <numeric>
#include <cstring>
#include <bitset>
#include <string>
#include <deque>
#include <stack>
#include <cmath>
#include <queue>
#include <set>
#include <map>
using namespace std;
#define INF 0x3f3f3f3f
#define LC(x) (x<<1)
#define RC(x) ((x<<1)+1)
#define MID(x,y) ((x+y)>>1)
#define CLR(arr,val) memset(arr,val,sizeof(arr))
#define FAST_IO ios::sync_with_stdio(false);cin.tie(0);
typedef pair<int, int> pii;
typedef long long LL;
const double PI = acos(-1.0);
const int N = 15;
const int MAX_V = 35;
const int MAX_E = MAX_V * MAX_V;
struct edge
{
    int to, nxt;
    double dx;
    edge() {}
    edge(int _to, int _nxt, double _dx): to(_to), nxt(_nxt), dx(_dx) {}
};
edge E[MAX_E << 1];
int head[MAX_V], tot;
double dis[MAX_V][1 << N];
int vis[MAX_V][1 << N];
double ti[N];
void init()
{
    CLR(head, -1);
    tot = 0;
}
void add(int s, int t, double dx)
{
    E[tot] = edge(t, head[s], dx);
    head[s] = tot++;
}
void spfa(int s, int n)
{
    queue<pii>Q;
    for (int i = 0; i < MAX_V; ++i)
        fill(dis[i], dis[i] + (1 << N), 1e9);
    CLR(vis, 0);
    Q.push(pii(s, 0));
    vis[s][0] = 1;
    dis[s][0] = 0;
    while (!Q.empty())
    {
        int u = Q.front().first;
        int t = Q.front().second;
        Q.pop();
        vis[u][t] = 0;
        for (int i = head[u]; ~i; i = E[i].nxt)
        {
            int v = E[i].to;
            for (int j = 0; j < n; ++j)
            {
                if (t & (1 << j))
                    continue;
                int V = (t | (1 << j));
                double dx = E[i].dx / ti[j];
                if (dis[v][V] > dis[u][t] + dx)
                {
                    dis[v][V] = dis[u][t] + dx;
                    if (!vis[v][V])
                    {
                        vis[v][V] = 1;
                        Q.push(pii(v, V));
                    }
                }
            }
        }
    }
}
int main(void)
{
    int n, m, p, a, b, i, x, y, z;
    while (~scanf("%d%d%d%d%d", &n, &m, &p, &a, &b) && (n | m | p | a | b))
    {
        init();
        for (i = 0; i < n; ++i)
        {
            scanf("%lf", &ti[i]);
        }
        for (i = 0; i < p; ++i)
        {
            scanf("%d%d%d", &x, &y, &z);
            add(x, y, z * 1.0);
            add(y, x, z * 1.0);
        }
        spfa(a, n);
        double ans = *min_element(dis[b], dis[b] + (1 << n) + 1);
        ans == 1e9 ? puts("Impossible") : printf("%.3f\n", ans);
    }
    return 0;
}
POJ 2686 Traveling by Stagecoach(状压二维SPFA)
标签:rri example 最短路 sid dag fill input info ror
原文地址:http://www.cnblogs.com/Blackops/p/7100492.html