POJ 2449 Remmarguts' Date(k短路模板)

link:https://vjudge.net/problem/POJ-2449

前面输入与大多最短路题相同

最后一行输入s,t,k 求从s到t的第K短路

#include <iostream>
#include <cstring>
#include <queue>

using namespace std;

const int MAXN=1010;

struct node
{
     int p,g,h;
     bool operator < (node a) const
     {
          return a.g+a.h<g+h;
     }
};

struct node1
{
     int x,y,w,next;
}line[MAXN*100],line1[MAXN*100];

int n,m,i,link[MAXN],link1[MAXN],g[MAXN],s,e,k;
bool used[MAXN];
priority_queue<node> myqueue;

void djikstra()
{
     int i,k,p;
     memset(used,0,sizeof(used));
     memset(g,0x7F,sizeof(g));
     g[e]=0;
     for (p=1;p<=n;p++)
     {
          k=0;
          for (i=1;i<=n;i++)
            if (!used[i] && (!k || g[i]<g[k]))
              k=i;
          used[k]=true;
          k=link1[k];
          while (k)
          {
               if (g[line1[k].y]>g[line1[k].x]+line1[k].w)
                   g[line1[k].y]=g[line1[k].x]+line1[k].w;
               k=line1[k].next;
          }
     }
     return ;
}

int Astar()
{
    int t,times[MAXN];
    node h,temp;
    while(!myqueue.empty()) myqueue.pop();
    memset(times,0,sizeof(times));
    h.p=s;h.g=0;h.h=0;myqueue.push(h);
    while(!myqueue.empty())
    {
        h=myqueue.top();
        myqueue.pop();
        times[h.p]++;
        if(times[h.p]==k&&h.p==e) return h.h+h.g;
        if(times[h.p]>k) continue;
        t=link[h.p];
        while(t)
        {
            temp.h=h.h+line[t].w;
            temp.g=g[line[t].y];
            temp.p=line[t].y;
            myqueue.push(temp);
            t=line[t].next;
        }
    }
    return -1;

}

int main()
{
    ios::sync_with_stdio(false);
    cin>>n>>m;

    memset(link,0,sizeof(link));
    memset(link1,0,sizeof(link1));

    for(int i=1;i<=m;i++)
    {
        cin>>line[i].x>>line[i].y>>line[i].w;
        line[i].next=link[line[i].x]; link[line[i].x]=i;
        line1[i].x=line[i].y; line1[i].y=line[i].x; line1[i].w=line[i].w;
        line1[i].next=link1[line1[i].x]; link1[line1[i].x]=i;
    }
    cin>>s>>e>>k;
    if(s==e) k++;
    djikstra();
    cout<<Astar()<<endl;

    return 0;
}

POJ 2449 Remmarguts' Date(k短路模板)

原文地址:https://www.cnblogs.com/Fy1999/p/9457350.html

时间: 2024-10-10 16:46:46

POJ 2449 Remmarguts' Date(k短路模板)的相关文章

poj 2449 Remmarguts&#39; Date k短路

/*poj 2449 k短路 A* 估价函数是 s到i的距离+i到t的距离 */ #include<cstdio> #include<queue> #include<vector> #define inf 1e7 #define maxn 100010 using namespace std; int n,m,S,T,K,num1,num2,head1[maxn],head2[maxn],dis[maxn]; int q[maxn],hea,tai,f[maxn],cn

[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

POJ 2449 Remmarguts&#39; Date (第k短路 A*搜索算法模板)

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

poj 2449 Remmarguts&#39; Date (k短路模板)

Remmarguts' Date http://poj.org/problem?id=2449 Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 30772   Accepted: 8397 Description "Good man never makes girls wait or breaks an appointment!" said the mandarin duck father. Softly tou

图论(A*算法,K短路) :POJ 2449 Remmarguts&#39; Date

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

POJ 2449 Remmarguts&#39; Date ( Dijkstra + A* 求解第K短路 )

#include <iostream> #include <cstring> #include <queue> #include <fstream> using namespace std; #define E 100005 #define V 1005 #define INF 1 << 30 int heads[V], r_heads[V]; int dists[V]; bool visits[V]; int nEdgeNum, nNodeNu

poj 2449 Remmarguts&#39; Date(K短路,A*算法)

http://poj.org/problem?id=2449 大致题意:给出一个有向图,求从起点到终点的第K短路. K短路与A*算法详解  学长的博客... 算法过程 #include <stdio.h> #include <iostream> #include <algorithm> #include <set> #include <map> #include <vector> #include <math.h> #in

poj 2449 Remmarguts&#39; Date A*+spfa求第k短路

题意: 经典的第k短路,A*算法的经典应用之一. 分析: A*,已走的路程g+到终点的最短距离为启发函数,搜索过程中不判重,第k次到t节点时就求出了第k短路. 代码: //poj 2449 //sep9 #include <iostream> #include <queue> using namespace std; const int maxN=1024; const int maxM=100024; int n,m,s,t,k,e,ne; int head[maxN],nhea

POJ 2449 Remmarguts&#39; Date (A*搜索求K短路)

传送门 这是一道裸的K短路的问题,我们将会用A*解决. 我们设计估值函数h的时候可以像这样想.因为h(n) <= h*(n)而且要尽量接近h*(n),所以我们想到,可以求一个从目标节点到其余节点的最短路,这个一定是小于等于实际值的.然后就用A*从起点开始搜索,找到一个节点v,就使cnt[v]加1.当cnt[v] > k时就可以剪枝了,因为这一定不再K短路的路线上了.很好通过反证法得到证明.当目标节点被搜索到了第k次的时候就可以结束搜索了. 要注意这道题有一个很坑的地方,就是若给出的起点=终点,