【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\n",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\n",e.v,h[e.v]);
                if(h[e.v] >= h[x.x] + e.dis) {
        //            printf("===== %d -> %d\n",x.x,e.v);
                    h[e.v] = h[x.x] + e.dis;
                    que.push((Node){e.v,h[e.v],0});
                }
            }
        }
    //    printf("--- %d %d\n",(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\n",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\n",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\n",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

*/

猜你喜欢

转载自www.cnblogs.com/noblex/p/9726597.html