• poj 2449 Remmarguts' Date 求第k短路 Astar算法


    =.=好菜

    #include <iostream>
    #include <cstdio>
    #include <string.h>
    #include <cstring>
    #include <queue>
    
    using namespace std;
    const int N = 1e3+10;
    const int M = 100000+10;
    typedef long long ll;
    const ll INF = 1e15;
    
    int n,m,head[N],rehead[N],tot;
    struct node {
        int v,w,next;
    }E[M],reE[M];
    
    void init() {
        tot=0;
        memset(head,0,sizeof(head));
        memset(rehead,0,sizeof(rehead));
    }
    void addEdge(int u,int v,int w) {
        ++tot;
        E[tot].next = head[u];
        head[u]=tot;
        E[tot].v = v;
        E[tot].w = w;
    
        reE[tot].next = rehead[v];
        rehead[v]=tot;
        reE[tot].v = u;
        reE[tot].w = w;
    }
    
    bool inq[N]; ll d[N];
    queue<int>que;
    void spfa(int src) {
        while(!que.empty())
            que.pop();
        for(int i=0;i<N;i++) d[i]=INF;
        memset(inq,0,sizeof(inq));
        d[src]=0;
        inq[src] = 1;
        que.push(src);
        while(!que.empty()) {
            int now = que.front();
            que.pop();
            //if(vis[now]) continue;
            //vis[now]=1;
            inq[now] = 0;
            for(int i=rehead[now]; i; i=reE[i].next) {
                int v = reE[i].v;
                int w = reE[i].w;
                if(d[v] > d[now] + w) {
                    d[v] = d[now] + w;
                    if(!inq[v])
                        que.push(v);
                }
            }
        }
    }
    
    struct A {
        int v;
        ll f,g;
        ///v是current点 f(v)=g(v)+h(v) g(v):st到v的估值, h(v):v到ed的估值
        bool operator<(const A other) const {
            if(other.f == f) return other.g < g;
            return other.f < f;
        }
    };
    
    int Astar(int st,int ed,int k) {
        priority_queue<A> Q;
        if(st==ed) k++;
        if(d[st]==INF) return -1;
        int cnt = 0;
        A t,tt;
        t.v=st,t.g=0,t.f=t.g+d[st];
        Q.push(t);
        while (!Q.empty()) {
            tt = Q.top(); Q.pop();
            int u=tt.v;
            if(u == ed) {
                cnt++;
                if(cnt==k) return tt.g;
            }
            for(int i=head[u]; i; i=E[i].next) {
                t.v = E[i].v;
                t.g = tt.g + E[i].w;
                t.f = t.g + d[t.v];
                Q.push(t);
    
            }
        }
        return -1;
    }
    
    
    int main () {
        //freopen("in.txt","r",stdin);
        while (scanf("%d %d", &n, &m)==2) {
            init();
            for(int i=1;i<=m;i++) {
                int x,y,z; scanf("%d%d%d",&x,&y,&z);
                addEdge(x,y,z);
            }
            int s,t,k; scanf("%d%d%d",&s, &t, &k);
            spfa(t);
            //for(int i=1;i<=n;i++) cout << d[i]<<endl;
            cout<<Astar(s,t,k)<<endl;
        }
        return 0;
    }
  • 相关阅读:
    C#学习笔记_01_基础内容
    C#学习笔记_03_运算符
    C#学习笔记_02_数据类型
    统计学习方法(一)
    《史蒂夫·乔布斯传》读书笔记
    《孵化twitter》读书笔记
    保存和恢复 Android Fragment 的状态
    计算机视觉中的边缘检测
    Android开发的过去、现在和将来
    Python常用的第三方库
  • 原文地址:https://www.cnblogs.com/Draymonder/p/9634958.html
Copyright © 2020-2023  润新知