k短路模板

https://acm.taifua.com/archives/jsk31445.html

链接:

https://nanti.jisuanke.com/t/31445

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
const int maxn = 1010;
const int inf = 0x3f3f3f3f;
int n, m, s, t, k, Time;
bool vis[maxn];
int dist[maxn];

struct Node
{
    int v, c;
    Node (int _v = 0, int _c = 0): v(_v), c(_c) {}
    bool operator < (const Node &rhs) const
    {
        return c + dist[v] > rhs.c + dist[rhs.v]; // 估价函数 fx = gx + hx 路径短先出队
    }
};

struct Edge
{
    int to, cost;
    Edge (int _to = 0, int _cost = 0): to(_to), cost(_cost) {}
};

vector <Edge> E[maxn], revE[maxn];

void addedge(int u, int v, int w)
{
    E[v].push_back(Edge(u, w)); // 反向加边
    revE[u].push_back(Edge(v, w)); // 正向加边
}

void dijkstra(int s, int n) // 最短路
{
    for (int i = 0; i <= n; ++i)
    {
        vis[i] = false;
        dist[i] = inf;
    }
    dist[s] = 0;
    priority_queue <Node> Q;
    Q.push(Node(s, dist[s]));
    while (!Q.empty())
    {
        Node tmp = Q.top();
        Q.pop();
        int u = tmp.v;
        if (vis[u])
            continue;
        vis[u] = true;
        for (int i = 0; i < E[u].size(); ++i)
        {
            int v = E[u][i].to, cost = E[u][i].cost;
            if (!vis[v] && dist[v] > dist[u] + cost)
            {
                dist[v] = dist[u] + cost;
                Q.push(Node(v, dist[v]));
            }
        }
    }
}

int astar(int s)
{
    if (dist[s] == inf) // 不能到达
        return -1;
    priority_queue <Node> Q;
    Q.push(Node(s, 0));
    k--;
    while (!Q.empty())
    {
        Node tmp = Q.top();
        Q.pop();
        int u = tmp.v;
        if (tmp.c + dist[u] > Time) // 超时直接返回-1,可不要
            return  -1;
        if (u == t)
        {
            if (k)
                --k;
            else  // 第k次到达目标节点t
                return tmp.c;
        }
        for (int i = 0; i < revE[u].size(); ++i)
        {
            int v = revE[u][i].to, cost = revE[u][i].cost;
            Q.push(Node(v, tmp.c + cost));
        }
    }
    return -1;
}

int main()
{
    int u, v, w;
    while (scanf("%d%d", &n, &m) != EOF)
    {
        scanf("%d%d%d%d", &s, &t, &k, &Time);
        for (int i = 0; i <= n; ++i)
        {
            E[i].clear();
            revE[i].clear();
        }
        for (int i = 0; i < m; ++i)
        {
            scanf("%d%d%d", &u, &v, &w);
            addedge(u, v, w);
        }
        dijkstra(t, n); // t点到所有点的最短路
        int ans = astar(s);
        if (ans == -1 || ans > Time) // 无法到达或者超过时间
            printf("Whitesnake!\n");
        else
            printf("yareyaredawa\n");
    }
    return 0;
}

 

posted @ 2018-09-13 10:13  Neord  阅读(134)  评论(0编辑  收藏  举报