• 【BZOJ】1975 [Sdoi2010]魔法猪学院(A*)


    题目

    传送门:QWQ

    分析

    k短路,Astar。估价函数是终点向外跑的最短路。

    显然不是正解qwq。

    代码

    // By noble_
    // Astar algorithm
    
    // #include <bits/stdc++.h>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    #include <queue>
    #include <vector>
    using namespace std;
    
    const int maxn = 10050;
    double h[maxn];
    int n,m,s,t;
    
    struct Edge{ int u,v; double dis; };
    struct Node{
        int x;double dis,g;
        bool operator < (const Node& a) const{ return dis>a.dis; }
    //    Node(int xx,double d){x=xx;dis=d;}
    };
    priority_queue<Node> que;
    struct QwQ{
        vector<Edge> edges;
        vector<int> G[maxn];
        int vis[maxn];
        //传边反着穿
        void Addedge(int u,int v,double dis) {
            edges.push_back((Edge){u,v,dis});
            G[u].push_back(edges.size()-1);
        }
        void dijkstra() {
            while(!que.empty()) que.pop();
            memset(vis,0,sizeof(vis));
            for(int i=0;i<=n;i++) h[i]=1e8;
            que.push((Node){t,0,0}); h[t]=0;
            while(!que.empty()) {
                Node x=que.top(); que.pop();
                if(vis[x.x]) continue;
            //    printf("======== %d %f
    ",x.x,x.dis);
                vis[x.x]=1;
                for(int i=0;i<G[x.x].size();i++) {
                    Edge& e=edges[G[x.x][i]];
            //        printf("=--==-=-=- %d %f
    ",e.v,h[e.v]);
                    if(h[e.v] >= h[x.x] + e.dis) {
            //            printf("===== %d -> %d
    ",x.x,e.v);
                        h[e.v] = h[x.x] + e.dis;
                        que.push((Node){e.v,h[e.v],0});
                    }
                }
            }
        //    printf("--- %d %d
    ",(int)h[1],(int)h[2]);
        }
    }qwq;
    
    vector<Edge> edges;
    vector<int> G[maxn];
    int reach[maxn], k, ans=0;
    double p, sum=0;
    void Addedge(int u,int v,double dis) {
        edges.push_back((Edge){u,v,dis});
        G[u].push_back(edges.size()-1);
    }
    void Astar() {
        while(!que.empty()) que.pop();
    //    if(h[s] >= 1e8) return -1;
        memset(reach,0,sizeof(reach));
    //    priority_queue<Node> que;
        que.push((Node){s,h[s],0});
        while(!que.empty()) {
            Node x=que.top(); que.pop();
        //    printf("---- %d %f
    ",x.x,x.dis);
            reach[x.x]++;
            if(reach[x.x]>k)continue;
            if(x.x==t) {
                if(sum+x.g <= p) sum+=x.g,ans++;
                else break;
            }
            for(int i=0;i<G[x.x].size();i++) {
                Edge e=edges[G[x.x][i]];
            //    printf("======= %d %f %f
    ",e.v,h[e.v]+x.dis+e.dis,h[e.u]);
                que.push((Node){e.v,h[e.v] + x.g + e.dis, x.g+e.dis});
            }
        }
    //    return -1;
    }
    
    int main() {
        scanf("%d%d%lf",&n,&m,&p);
    
        for(int i=0;i<m;i++) {
            int a,b;double c;
            scanf("%d%d%lf",&a,&b,&c);
            qwq.Addedge(b,a,c);
            Addedge(a,b,c);
        }
        // scanf("%d%d%d",&s,&t,&k);
        // if(s==t) k++;
        s=1; t=n; 
        qwq.dijkstra(); k=int(p/h[1]);
        Astar();
        printf("%d
    ",ans);
    }
    /*
    4 6 15
    1 2 1.5
    2 1 1.5
    1 3 3
    2 3 1.5
    3 4 1.5
    1 4 1.5
    
    */
  • 相关阅读:
    python入门_老男孩_文件操作
    python入门_老男孩_列表和字典循环删除的正确方法
    python入门_老男孩_集合_元祖
    linux入门_韩顺平_复习版_文件目录类
    python-re模块
    sorted()函数
    偏函数+高阶函数
    生成器
    闭包
    匿名函数
  • 原文地址:https://www.cnblogs.com/noblex/p/9726597.html
Copyright © 2020-2023  润新知