poj2449 k短路问题

  这个题就是让你求出S点到T点的第K短路, 使用A*搜索就可以, 搜索使用两个指标函数 h g, h表示从源点到当前点的最短路, g点表示从当前点到汇点的最短路, 搜索的时候v顶点第k次出队时的h就是第k短路的长度, 代码如下:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <vector>

using namespace std;
const int maxn = 1000 + 10;
int N, M;
int S, T, K;
struct edge { int v, c; };
vector<edge> G[maxn];           //正向边
vector<edge> P[maxn];           //反向边
int g[maxn];                    //求解出h函数的值
struct Dij
{
    int u, c;
    bool operator<(const Dij&r) const
    {
        return c>r.c;
    }
};
bool vis[maxn];
void dijkstra(int s)
{
    memset(g, 0x3f, sizeof(g));
    g[s] = 0;
    memset(vis, 0, sizeof(vis));
    priority_queue<Dij> que;
    que.push((Dij){s, 0});
    while(!que.empty())
    {
        Dij tp = que.top(); que.pop();
        int u=tp.u;
        if(vis[u]) continue;
        vis[u] = 1;
        for(int i=0; i<P[u].size(); i++)
        {
            int v = P[u][i].v, cost = P[u][i].c;
            if(g[v] > g[u]+cost)
            {
                g[v] = g[u]+cost;
                que.push((Dij){v, g[v]});
            }
        }
    }
}

struct Astar
{
    int h, g, u;
    bool operator< (const Astar& r) const
    {
        return h+g > r.h+r.g;
    }
};

int times[maxn];
int astar()
{
    memset(times, 0, sizeof(times));
    priority_queue<Astar> que;
    que.push((Astar){0, g[S], S});
    if(S == T) K++;
    while(!que.empty())
    {
        Astar tp = que.top(); que.pop();
        int u = tp.u;
        times[u]++;
        if(times[u]==K && u==T) return tp.h;
        else if(times[u] > K) continue;
        for(int i=0; i<G[u].size(); i++)
        {
            int v = G[u][i].v, c=G[u][i].c;
            que.push((Astar){tp.h+c, g[v], v});
        }
    }
    return -1;
}

int main()
{
    scanf("%d%d", &N, &M);
    for(int i=0; i<M; i++)
    {
        int u, v, t;
        scanf("%d%d%d", &u, &v, &t);
        G[u].push_back((edge){v, t});
        P[v].push_back((edge){u, t});
    }
    scanf("%d%d%d", &S, &T, &K);
    dijkstra(T);
    int res = astar();
    printf("%d\n", res);
    return 0;
}
时间: 2024-10-29 19:12:17

poj2449 k短路问题的相关文章

POJ2449:K短路

Remmarguts' Date Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 26355   Accepted: 7170 Description "Good man never makes girls wait or breaks an appointment!" said the mandarin duck father. Softly touching his little ducks' head, h

poj2449 Remmarguts&#39; Date,第K短路

点击打开链接 SPFA  + A* #include <cstdio> #include <queue> #include <cstring> #include <algorithm> using namespace std; struct node { int v, dis, f, next; friend bool operator <(node a, node b){ return a.f>b.f; } }; const int INF =

POJ2449 Remmarguts&#39; Date 【k短路】

Remmarguts' Date Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 21064   Accepted: 5736 Description "Good man never makes girls wait or breaks an appointment!" said the mandarin duck father. Softly touching his little ducks' head, h

POJ2449 Remmarguts&#39; Date 第K短路

POJ2449 比较裸的K短路问题 K短路听起来高大上 实际思路并不复杂 首先对终点t到其他所有点求最短路 即为dist[] 然后由起点s 根据当前走过的距离+dist[]进行A*搜索 第k次到达t即为第K短路 代码也很简单 //数组开的不够 不一定是运行时错误! 可能也会WA #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath&g

[poj2449]Remmarguts&#39; Date(K短路模板题,A*算法)

解题关键:k短路模板题,A*算法解决. #include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #include<iostream> #include<cmath> #include<queue> using namespace std; typedef long long ll; const int N=1e3+10; const

(WA)POJ2449 第K短路

POJ2449 第K短路 改了好长时间发现读入读反了qwq A*,先在反向图上求出每个点到t的最短距离,作为估价函数即可 疑问:能不能直接记录h+g 1 #include <cstdio> 2 #include <cstring> 3 #include <cctype> 4 #include <algorithm> 5 #include <queue> 6 #include <iostream> 7 using namespace s

poj2449:第k短路问题

Description "Good man never makes girls wait or breaks an appointment!" said the mandarin duck father. Softly touching his little ducks' head, he told them a story. "Prince Remmarguts lives in his kingdom UDF – United Delta of Freedom. One

poj2449 第k短路

题目链接 学习博客:https://blog.csdn.net/Z_Mendez/article/details/47057461 k短路没有我想象的那么难,还是很容易理解的 求s点到t点的第k短路径 先求出t到所有点的最短路径,用g[i]表示t到i的距离 从s开始"bfs",按照(g[i]+bfs路过的长度)构造优先队列,比如刚开始bfs路过长度为0,所在点为s 一直选择最小的(g[i]+bfs路过的长度),第一次到达t一定是从s沿着最短路径到达. 直到第k次到达t 理解代码可能更容

次短路 + 第K短路 模版

虽然从字面上看,次短路和第2短路是一样的.但是我在题目中遇到的却不是这样的. 在有些题目中,需要判断次短路是否存在.比如说,u.v之间只有一条路径.那么只有最短路.次短路是不存在的.这时候,解题方法是先求出最短路,然后枚举删除最短路径中的边,然后求最小值.题目可以看poj3986. 第K短路的实现是 SPFA + A* 算法. A*算法通过一个估价函数f(h)来估计途中的当前点p到终点的距离,并由此决定它的搜索方向,当这条路径失败时,它会尝试其他路径.对于A*,估价函数 = 当前值 + 当前位置