最近在学A*,又因为某位大佬讲了一下k短路算法
所以就拿来练练。然而以我的能力,在考试中并不会考到。
题目是[SDOI2010]魔法猪学院。
然而luogu数据有加强。没有左偏堆过不了233
// luogu-judger-enable-o2
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<queue>
using namespace std;
struct node
{
int point;
double value;
bool operator < (const node& a)const
{
return value>a.value;
}
node (int pint,double dus)
{
point=pint;
value=dus;
}
};
vector<node>tor[6010];
vector<node>bac[6010];
int n,m,a,b;
double e,distanc;
double dis[6010];
bool inque[6010];
void SPFA(int begin,int end)
{
for(int i=1;i<=n;i++)
dis[i]=0x7ffffff;
dis[begin]=0;
inque[begin]=true;
queue<int>q;
q.push(begin);
while(!q.empty())
{
int pas=q.front();
q.pop();
inque[pas]=false;
for(int i=0;i<bac[pas].size();i++)
{
int nxt_1=bac[pas][i].point;
double nxt_2=bac[pas][i].value;
if(dis[nxt_1]>dis[pas]+nxt_2)
{
dis[nxt_1]=dis[pas]+nxt_2;
if(!inque[nxt_1])
{
inque[nxt_1]=true;
q.push(nxt_1);
}
}
}
}
}
long long A_star(int begin,int end)
{
priority_queue<node>q;
q.push(node(begin,dis[begin]));
long long ans=0;
while(!q.empty())
{
node pas=q.top();
q.pop();
int pas_1=pas.point;
double pas_2=pas.value;
if(pas_2>e)
return ans;
if(pas_1==n)
{
e-=pas_2;
ans+=1;
}
for(int i=0;i<tor[pas_1].size();i++)
q.push(node(tor[pas_1][i].point,pas_2-dis[pas_1]+tor[pas_1][i].value+dis[tor[pas_1][i].point]));
}
return ans;
}
int main()
{
scanf("%d%d%lf",&n,&m,&e);
for(int i=1;i<=m;i++)
{
scanf("%d%d%lf",&a,&b,&distanc);
tor[a].push_back(node(b,distanc));
bac[b].push_back(node(a,distanc));
}
SPFA(n,1);
printf("%lld",A_star(1,n));
}
/*
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
*/