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

理解代码可能更容易些

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<queue>
#include<set>
#include<vector>
using namespace std;
#define ll long long
const int maxn=1e3+5;
const int INF=1e9;

struct line
{
    int to,w;
    line(int _to,int _w)
    {
        to=_to,w=_w;
    }
};
vector<line>ma1[maxn],ma2[maxn];//ma1为真实的路线,ma2为逆的,为了计算终点到各个点的最短距离
int g[maxn],vis[maxn];//g数组为终点到各个点的最短距离
int n,m,s,t,k,time;
struct node
{
    int x,time;//当前节点走过的距离time + x到终点的距离就是这条路线的距离
    node(int _x,int _time)
    {
        x=_x,time=_time;
    }
    bool operator<(const node &a)const
    {
        return g[x]+time>g[a.x]+a.time;
    }
};
void dij()//为了构造g数组
{
    for(int i=1;i<=n;i++)vis[i]=0,g[i]=1e9;
    g[t]=0;
    for(int i=1;i<=n;i++)
    {
        int inde,mi=1e9+10;
        for(int j=1;j<=n;j++)
        {
            if(vis[j]==0&&mi>g[j])
            {
                mi=g[j];
                inde=j;
            }
        }
        vis[inde]=1;
        for(int j=0;j<ma2[inde].size();j++)
            g[ma2[inde][j].to]=min(g[ma2[inde][j].to],g[inde]+ma2[inde][j].w);
    }
}
int astar()//根据g数组指引“bfs”运动
{
    priority_queue<node>que;
    que.push(node(s,0));
   if(s==t)
        k++;
    while(que.size())
    {
        node now=que.top();
        que.pop();
        if(now.x==t)time++;        //到达终点
        if(time==k)return now.time;
        for(int i=0;i<ma1[now.x].size();i++)
        {
            que.push(node(ma1[now.x][i].to,now.time+ma1[now.x][i].w));
        }
    }
    return -1;
}
int main()
{

    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        int a,b,c;
        scanf("%d %d %d",&a,&b,&c);
        ma1[a].push_back(line(b,c));
        ma2[b].push_back(line(a,c));
    }
    cin>>s>>t>>k;
    dij();
    cout<<astar()<<endl;;
    return 0;
}

  

原文地址:https://www.cnblogs.com/carcar/p/9610632.html

时间: 2024-10-03 16:35:38

poj2449 第k短路的相关文章

(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短路问题(A*算法)

启发函数:f(x)=g(x)+h(x); g(x)表示初始点到x状态的代价,h(x)表示从x的状态到目标状态的代价的估计值(并不是真实的),实际最小代价<=h(x); 起点s,终点t,x.v=s,x.len=0;然后优先队列中f(x)值最小值出队列,再根据出队列的x.v状态发展下一层.如果出队列时第一次遇到x.v==t, 就找到了s到t的最短路....如果第k次,那就是第k短.为了加速计算,h(p)需要在A*搜索之前进行预处理,只要将原图的所有边反向, 再从终点t做一次单源点最短路径就能得到每个

POJ2449 (k短路)

#include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <queue> using namespace std; #define maxn 2008 #define maxm 2000008 #define INF 2000000000 int lt[maxn],LT[maxn],sum=1,SUM=1; int h[maxn]; in

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

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短路问题

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