poj 2449 Remmarguts' 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],cnt,ans;
struct edge{
    int v,t,pre;
}e1[maxn],e2[maxn];
struct node{
    int v,f,g;
    bool operator < (const node &x)const{
        return (f==x.f&&g>x.g)||f>x.f;//注意重载的时候>
    }
};
priority_queue<node>Q;
int init(){
    int x=0,f=1;char s=getchar();
    while(s<‘0‘||s>‘9‘){if(s==‘-‘)f=-1;s=getchar();}
    while(s>=‘0‘&&s<=‘9‘){x=x*10+s-‘0‘;s=getchar();}
    return x*f;
}
void Add1(int from,int to,int dis){
    num1++;e1[num1].v=to;
    e1[num1].t=dis;
    e1[num1].pre=head1[from];
    head1[from]=num1;
}
void Add2(int from,int to,int dis){
    num2++;e2[num2].v=to;
    e2[num1].t=dis;
    e2[num1].pre=head2[from];
    head2[from]=num2;
}
void Cl(){
    num1=num2=ans=cnt=0;
    for(int i=1;i<=n;i++)
        head1[i]=head2[i]=f[i]=0;
}
void SPFA1(){
    for(int i=1;i<=n;i++)dis[i]=inf;
    f[T]=1;dis[T]=0;hea=0;tai=0;
    q[++tai]=T;
    while(hea<=tai){
        int k=q[++hea];f[k]=0;
        for(int i=head2[k];i;i=e2[i].pre){
            int v=e2[i].v;
            if(dis[v]>dis[k]+e2[i].t){
                dis[v]=dis[k]+e2[i].t;
                if(f[v]==0){
                    f[v]=1;q[++tai]=v;
                }
            }
        }
    }
}
void SPFA2(){
    while(!Q.empty())Q.pop();
    Q.push((node){S,dis[S],0});
    if(S==T)K++;//题目要求 0 不能算一条路....
    if(dis[S]>=inf){
        ans=-1;return;
    }
    while(!Q.empty()){
        node x=Q.top();Q.pop();
        int u=x.v;
        if(u==T)cnt++;
        if(cnt==K){
            ans=x.g;return;
        }
        for(int i=head1[u];i;i=e1[i].pre){
            node y;y.v=e1[i].v;
            y.g=x.g+e1[i].t;
            y.f=y.g+dis[e1[i].v];
            Q.push(y);
        }
    }
    ans=-1;
}
int main()
{
    while(~scanf("%d%d",&n,&m)){
        Cl();int u,v,t;
        for(int i=1;i<=m;i++){
            u=init();v=init();t=init();
            Add1(u,v,t);Add2(v,u,t);
        }
        S=init();T=init();K=init();
        SPFA1();SPFA2();printf("%d\n",ans);
    }
    return 0;
}

poj 2449 Remmarguts' Date k短路

时间: 2024-12-21 18:27:58

poj 2449 Remmarguts' Date k短路的相关文章

POJ 2449 Remmarguts&#39; 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 {

图论(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 (第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 ( 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 (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

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次的时候就可以结束搜索了. 要注意这道题有一个很坑的地方,就是若给出的起点=终点,

POJ 2449 Remmarguts&#39; Date ( 第 k 短路 &amp;&amp; A*算法 )

题意 : 给出一个有向图.求起点 s 到终点 t 的第 k 短路.不存在则输出 -1 #include<stdio.h> #include<string.h> #include<queue> #include<algorithm> using namespace std; const int INF = 0x3f3f3f3f; const int maxn = 1024; const int maxm = 100008; struct EDGE{ int v