poj 2499第K短路模板

第k*短路模板(单项边)
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#define Max 100005
#define inf 1<<28
using namespace std;
int S,T,K,n,m;
int head[Max],rehead[Max];
int num,renum;
int dis[Max];
bool visit[Max];
int ans[Max];
int qe[Max*10];
struct kdq{
    int v,len,next;
} edge[Max],reedge[Max];

struct a_star {               //A*搜索时的优先级队列;
    int v;
    int len;
    bool operator<(const a_star &a)const{    //f(i)=d[i]+g[i]
        return len+dis[v]>a.len+dis[a.v];
    }
};
void insert(int u,int v,int len){//正图和逆图
    edge[num].v=v;
    edge[num].len=len;
    edge[num].next=head[u];
    head[u]=num;
    num++;
    reedge[renum].v=u;
    reedge[renum].len=len;
    reedge[renum].next=rehead[v];
    rehead[v]=renum;
    renum++;
}

void init(){
    memset(ans,0,sizeof(ans));
    for(int i=0; i<=n; i++)
        head[i]=-1,rehead[i]=-1;
    num=1,renum=1;
}
void spfa(){//从T开始求出T到所有点的 dis[]
    int i,j;
    for(i=1; i<=n; i++)
        dis[i]=inf;
    dis[T]=0;
    visit[T]=1;
    int num=0,cnt=0;
    qe[num++]=T;
    while(num>cnt){
        int temp=qe[cnt++];
        visit[temp]=0;
        for(i=rehead[temp]; i!=-1 ; i=reedge[i].next){
            int tt=reedge[i].v;
            int ttt=reedge[i].len;
            if(dis[tt]>dis[temp]+ttt)
            {
                dis[tt]=dis[temp]+ttt;
                if(!visit[tt])
                {
                    qe[num++]=tt;
                    visit[tt]=1;
                }
            }
        }
    }
}
int A_star(){
    if(S==T)
        K++;
    if(dis[S]==inf)
        return -1;
    a_star n1;
    n1.v=S;
    n1.len=0;
    priority_queue <a_star> q;
    q.push(n1);
    while(!q.empty()){
        a_star temp=q.top();
        q.pop();
        ans[temp.v]++;
        if(ans[T]==K)//当第K次取到T的时候,输出路程
            return temp.len;
        if(ans[temp.v]>K)
            continue;
        for(int i=head[temp.v]; i!=-1; i=edge[i].next){
            a_star n2;
            n2.v=edge[i].v;
            n2.len=edge[i].len+temp.len;
            q.push(n2);
        }
    }
    return -1;
}
int main(){
    int i,j,k,l;
    int a,b,s;
    scanf("%d%d",&n,&m);
    init();
    while(m--){
        scanf("%d%d%d",&a,&b,&s);
        insert(a,b,s);
    }
    scanf("%d%d%d",&S,&T,&K);
    spfa();
    printf("%d
",A_star());
    return 0;
}
原文地址:https://www.cnblogs.com/13224ACMer/p/4857567.html