zoukankan      html  css  js  c++  java
  • A*——第K短路

    #include <cstring>
    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    #include <queue>
    
    using namespace std;
    
    const int INF=1e9;
    
    struct node
    {
        int to,w,next;
    }edge1[500010];
    
    node edge2[500010];
    
    struct A
    {
        int f,g,v;
        bool operator <(const A a)const
        {
            if(a.f==f)
                return a.g<g;
            return a.f<f;
        }
    };
    
    int head1[1010];
    int head2[1010];
    bool vis[1010];
    int dis[1010];
    int tol;
    int n,m,k;
    
    void addEdge(int u,int v,int w)
    {
        edge1[tol].to=v;
        edge1[tol].w=w;
        edge1[tol].next=head1[u];
        head1[u]=tol;
        edge2[tol].to=u;
        edge2[tol].w=w;
        edge2[tol].next=head2[v];
        head2[v]=tol;
        tol++;
    }
    
    void init()
    {
        tol=0;
        memset(head1,-1,sizeof(head1));
        memset(head2,-1,sizeof(head2));
    }
    
    void spfa(int des)
    {
        memset(vis,false,sizeof(vis));
        for(int i=1;i<=n;i++)
            dis[i]=INF;
        dis[des]=0;
        queue<int>q;
        vis[des]=true;
        q.push(des);
        while(!q.empty())
        {
            int u=q.front();
            q.pop();
            vis[u]=false;
            for(int i=head2[u];i!=-1;i=edge2[i].next)
            {
                int v=edge2[i].to;
                if(dis[v]>dis[u]+edge2[i].w)
                {
                    dis[v]=dis[u]+edge2[i].w;
                    if(!vis[v])
                    {
                        vis[v]=true;
                        q.push(v);
                    }
                }
            }
        }
    }
    
    int Astar(int src,int des)
    {
        int cnt=0;
        if(src==des)
            k++;
        if(dis[src]==INF)
            return -1;
        priority_queue<A>q;
        A a;
        a.v=src;
        a.g=0;
        a.f=dis[src];
        q.push(a);
        while(!q.empty())
        {
            A a=q.top();
            q.pop();
            if(a.v==des)
            {
                cnt++;
                if(cnt==k)
                {
                    return a.g;
                }
            }
            for(int i=head1[a.v];i!=-1;i=edge1[i].next)
            {
                A t;
                t.g=a.g+edge1[i].w;
                t.v=edge1[i].to;
                t.f=t.g+dis[t.v];
                q.push(t);
            }
        }
        return -1;
    }
    
    int main()
    {
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            init();
            int u,v,w;
            for(int i=0;i<m;i++)
            {
                scanf("%d%d%d",&u,&v,&w);
                addEdge(u,v,w);
            }
            int src,des;
            scanf("%d%d%d",&src,&des,&k);
            spfa(des);
            cout<<Astar(src,des)<<endl;
        }
        return 0;
    }
  • 相关阅读:
    CF280C Game on Tree 概率与期望
    bzoj 3420: Poi2013 Triumphal arch 树形dp+二分
    bzoj 2111: [ZJOI2010]Perm 排列计数 Lucas
    bzoj 3709: [PA2014]Bohater 贪心
    bzoj 1396/2865: 识别子串 后缀自动机+线段树
    【教程】如何搭建一个自己的网站
    C#单例设计模式
    C#双缓冲代码
    Hibernate的查询功能
    hibernate事务规范写法
  • 原文地址:https://www.cnblogs.com/wsruning/p/5749144.html
Copyright © 2011-2022 走看看