【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 */