• POJ2449 (k短路)


    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    #include <queue>
    using namespace std;
    
    #define maxn 2008
    #define maxm 2000008
    #define INF 2000000000
    
    int lt[maxn],LT[maxn],sum=1,SUM=1;
    int h[maxn];
    int s,t,k,n,m;
    bool pd[maxn];
    
    struct line{
        int u,v,w,nt;
    }eg[maxm],EG[maxm];
    
    inline void add(int u,int v,int w){
        eg[++sum].u=u; eg[sum].v=v; eg[sum].w=w; eg[sum].nt=lt[u]; lt[u]=sum;
    }
    inline void ADD(int u,int v,int w){
        EG[++SUM].u=u; EG[SUM].v=v; EG[SUM].w=w; EG[SUM].nt=LT[u]; LT[u]=SUM;
    }
    inline void read(int &x){
        char ch;
        for (ch=getchar();ch<'0'||ch>'9';ch=getchar()); x=ch-48;
        for (ch=getchar();ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-48;
    }
    
    inline void spfa(){
        queue<int> Q;
        for (int i=1;i<=n;i++) h[i]=INF;
        memset(pd,0,sizeof(pd));
         h[t]=0; pd[t]=1; Q.push(t);
         while (!Q.empty()){
             int u=Q.front(); Q.pop();
             for (int i=LT[u];i;i=EG[i].nt){
                 int v=EG[i].v;
                 if (h[u]+EG[i].w<h[v]){
                     h[v]=h[u]+EG[i].w;
                     if (!pd[v]){
                         pd[v]=1;
                         Q.push(v);
                     }
                 }
             }
             pd[u]=0;
         }
    }
    
    class node{
    public:
        int f,g,u;
        bool operator<(const node& t) const{
            return f>t.f;
        }
        node(int a,int b,int c):f(a),g(b),u(c){}
        node(){}
    };
    
    int iQ[maxn];
    inline int A_star(){
        priority_queue<node> Q;
        memset(iQ,0,sizeof(iQ));
        iQ[s]=0; Q.push(node(h[s],0,s));
        while (!Q.empty()){
            node cur=Q.top();
            //printf("%d %d %d %d
    ",cur.f,cur.g,cur.u,iQ[t]);
            Q.pop();
            iQ[cur.u]++;
            if (iQ[t]==k) return cur.f;
            if (iQ[cur.u]>k) continue;
    
            for (int i=lt[cur.u];i;i=eg[i].nt){
                int v=eg[i].v;
                Q.push(node(h[v]+cur.g+eg[i].w,cur.g+eg[i].w,v));
            }
        }
        return -1;
    }
    
    inline int main(){
        //freopen("1.in","r",stdin);
        read(n); read(m);
        for (int i=1;i<=m;i++) {
            int u,v,w;
            read(u); read(v); read(w);
            add(u,v,w);
            ADD(v,u,w); 
        }
        read(s); read(t); read(k);
        if (s==t) k++;
        spfa();
        //for (int i=1;i<=n;i++) printf("%d ",h[i]);
        printf("%d
    ",A_star());
        return 0;
    }
  • 相关阅读:
    RabbitMQ内存爆出
    SQL Server特殊用法笔记
    C# 实现一个可取消的多线程操作 示例
    js 下载图片与下载文件的方式一样;保存至本地 ASP.NET 方式
    ajaxfileupload.js的简单使用
    Wince 6.0适用 .NET 使用HttpRequest的Post上传文件,服务端的Web API接收Post上传上来的文件 代码
    C# .csv文件转为Excel格式;Excel格式转换为.csv
    将汉字转换为拼音
    检查汉子字符
    初学JQuery笔记
  • 原文地址:https://www.cnblogs.com/rpSebastian/p/4603209.html
Copyright © 2020-2023  润新知