【分析】
很明显是求k短路,我们用A*优化的Spfa来实现。
先预处理Dist[i]表示当前点到终点的最短距离。
然后优先队列中的关键字为dis+Dist[i],每次取出最小的关键字的i。
用它的dis更新它可以到的点的dis,然后放入优先队列。
当终点第k次出队的时候,就是到终点的k短路。
【代码】
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <queue>
#include <map>
#include <utility>
#include <functional>
#include <vector>
using namespace std;
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define rrep(i,b,a) for(int i=(b);i>=(a);--i)
#define LNF (~0Ull>>3)
#define pdi pair<double,int>
#define m_p make_pair
#define sf scanf
#define pf printf
#define MAXN 5010
#define MAXM 200010
struct edge{
int v;
double w;
edge* next;
}*head[2][MAXN],Edge[2][MAXM];
int idx;
int N,M;
int ans;
double E;
double Dist[MAXN];
bool vis[MAXN];
void Read(int& x,bool mark=0){
char tt=getchar();
for(;tt<'0'||'9'<tt;tt=getchar()) if(tt=='-') mark=1;
for(x=0;'0'<=tt&&tt<='9';x=(x<<1)+(x<<3)+tt-'0',tt=getchar());
x=mark?-x:x;
}
void Addedge(int u,int v,double w){
idx++;
Edge[0][idx].v=v;
Edge[0][idx].w=w;
Edge[0][idx].next=head[0][u];
head[0][u]=Edge[0]+idx;
Edge[1][idx].v=u;
Edge[1][idx].w=w;
Edge[1][idx].next=head[1][v];
head[1][v]=Edge[1]+idx;
}
void Init(){
Read(N);
Read(M);
sf("%lf",&E);
int u,v;double w;
while(M--){
Read(u);
Read(v);
sf("%lf",&w);
Addedge(u,v,w);
}
}
void Dijkstra(){
priority_queue<pdi,vector<pdi>,greater<pdi> >Pq;
memset(vis,0,sizeof vis);
rep(i,1,N) Dist[i]=LNF;
Dist[N]=0;
Pq.push(m_p(Dist[N],N));
while(!Pq.empty()){
int u=Pq.top().second;
Pq.pop();
if(vis[u]) continue;
vis[u]=true;
for(edge* p=head[1][u];p;p=p->next){
int v=p->v;
if((!vis[v])&&Dist[v]>Dist[u]+p->w){
Dist[v]=Dist[u]+p->w;
Pq.push(m_p(Dist[v],v));
}
}
}
}
void Astar_spfa(){
priority_queue<pdi,vector<pdi>,greater<pdi> >Pq;
Pq.push(m_p(Dist[1],1));
while(!Pq.empty()){
int u=Pq.top().second;
double dis=Pq.top().first-Dist[u];
Pq.pop();
if(u==N){
if(E>=dis){
E-=dis;
ans++;
continue;
}
else return;
}
for(edge* p=head[0][u];p;p=p->next){
int v=p->v;
Pq.push(m_p(dis+p->w+Dist[v],v));
}
}
}
void Solve(){
Dijkstra();
Astar_spfa();
pf("%d\n",ans);
}
int main(){
Init();
Solve();
return 0;
}