• 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;
    }
  • 相关阅读:
    JavaWeb 内存马一周目通关攻略
    Android应用攻与防
    JavaWeb 内存马二周目通关攻略
    Mysql 5.7 windows安装 zip安装
    [JavaScript] 单例模式
    [JavaScript] 策略模式
    Leecode刷题笔记
    Java面经
    一些开源项目在ARM上的移植
    ffmpeg和SDL的多媒体编程(二)输出到屏幕
  • 原文地址:https://www.cnblogs.com/13224ACMer/p/4857567.html
Copyright © 2020-2023  润新知