• 【BZOJ 1598】 牛跑步


    【题目链接】

               https://www.lydsy.com/JudgeOnline/problem.php?id=1598

    【算法】

              A*求k短路

    【代码】

              

    #include<bits/stdc++.h>
    using namespace std;
    #define MAXN 1010
    #define MAXM 10010
    const int INF = 2e9;
    
    int i,n,m,k,tot,rtot,u,v,w;
    int head[MAXN],rhead[MAXN],dist[MAXN];
    
    struct Edge
    {
            int to,w,nxt;
    } e[MAXM<<1];
    struct info
    {
            int s,d;
            friend bool operator < (info a,info b)
            {
                    return a.d + dist[a.s] > b.d + dist[b.s];        
            }        
    };
    
    inline void add(int u,int v,int w)
    {
            tot++;
            e[tot] = (Edge){v,w,head[u]};
            head[u] = tot;
            tot++;
            e[tot] = (Edge){u,w,rhead[v]};
            rhead[v] = tot;
    }
    inline void dijkstra(int s)
    {
            int i,u,v,w;
            static bool visited[MAXN];
            priority_queue< pair<int,int> > q;
            while (!q.empty()) q.pop();
            memset(visited,false,sizeof(visited));
            for (i = 1; i <= n; i++) dist[i] = INF;
            dist[s] = 0;
            q.push(make_pair(0,s));
            while (!q.empty())    
            {
                    u = q.top().second;
                    q.pop();
                    if (visited[u]) continue;
                    visited[u] = true;
                    for (i = rhead[u]; i; i = e[i].nxt)
                    {
                            v = e[i].to;
                            w = e[i].w;
                            if (dist[u] + w < dist[v])
                            {
                                    dist[v] = dist[u] + w;
                                    q.push(make_pair(-dist[v],v));        
                            }        
                    }    
            }    
    }
    inline void Astar(int s,int t)
    {
            int i,v,w,cnt = 0;
            priority_queue< info > q;
            info cur;
            while (!q.empty()) q.pop();
            q.push((info){s,0});
            while (!q.empty())
            {
                    cur = q.top();
                    q.pop();
                    if (cur.s == t)
                    {
                            cnt++;
                            if (cnt <= k) printf("%d
    ",cur.d);
                            else break;        
                    }        
                    for (i = head[cur.s]; i; i = e[i].nxt)
                    {
                            v = e[i].to;
                            w = e[i].w;
                            q.push((info){v,cur.d+w});
                    }
            }    
            for (i = 1; i <= k - cnt; i++) printf("-1
    ");    
    }
    
    int main() 
    {
            
            scanf("%d%d%d",&n,&m,&k);
            for (i = 1; i <= m; i++)
            {
                    scanf("%d%d%d",&u,&v,&w);
                    add(u,v,w);        
            }
            dijkstra(1);
            Astar(n,1);
            
            return 0;
        
    }
  • 相关阅读:
    魔兽世界祭拜长者
    Mono嵌入C++
    kxb-shell文件操作-kxb
    GAN初步理解
    Pytorch 常用函数方法的理解
    转载:StyleGAN & StyleGAN2 论文解读
    RepVGG
    多目标跟踪,REID, JDE跟踪器解析
    卷积和反卷积详细说明
    FairMOT解析
  • 原文地址:https://www.cnblogs.com/evenbao/p/9272258.html
Copyright © 2020-2023  润新知