不知道哪里错了 qwq
大佬帮帮 qwq
#include <bits/stdc++.h>
#define int long long
#define double long double
#define endl "\n"
#define pii pair<double,int>
#define p1(x) ((x).first)
#define p2(x) ((x).second)
#define ls(x) T[x].ls
#define rs(x) T[x].rs
#define ds(x) T[x].ds
#define w(x) T[x].e.w
#define t(x) T[x].e.v
#define i128 __int128_t
using namespace std;
int n,m;
double K;
struct EDGE{int u,v;double w;
EDGE(int U=0,int V=0,double W=0){
v=V,u=U,w=W;
}
}E[200020];
int cnt=0;
struct edge{int v,id;double w;
edge(int V=0,int ID=0,double W=0){
v=V,id=ID,w=W;
}
};
vector<edge>g[5010],G[5010];
struct node{
int ls,rs,ds;
edge e;
node(int l=0,int r=0,int d=0,edge E=edge()){
ls=l,rs=r,ds=d,e=E;
}
friend bool operator <(const node A,const node B){return A.e.w<B.e.w;}
}T[300003];
int ctz;
int rt[5010];
inline void upd(int x){
if(ds(ls(x))<ds(rs(x)))swap(ls(x),rs(x));
ds(x)=ds(rs(x))+1;
}
inline int merge(int x,int y){
if(!x||!y)return x|y;
if(T[y]<T[x])swap(x,y);
int p=++ctz;
T[p]=T[x];
rs(p)=merge(rs(x),y);
upd(p);
return p;
}
bool p[200300];
double d[5100];
int pre[5100];
vector<int>f[5100];
inline void add(int u,int v,double w){
++cnt;
E[cnt]={u,v,w};
g[v].push_back({u,cnt,w});
}
inline int BD(vector<edge>Y){
if(Y.empty())return 0;
int p=++ctz;
auto it=Y.begin();
it++;
bool tg=0;
vector<edge>L,R;
while(it!=Y.end()){
if(tg)
L.push_back(*it);
else R.push_back(*it);
it++;
tg^=1;
}
T[p]=node(BD(L),BD(R),0,*Y.begin());
upd(p);
return p;
}
inline void dfs(int u){
for(int v:f[u])
rt[v]=merge(rt[v],rt[u]),dfs(v);
}
inline void dij(){
for(int i=1;i<=n;i++)
d[i]=1e18;
d[n]=0;
priority_queue<pii,vector<pii>,greater<pii>>q;
q.push({0,n});
while(!q.empty()){
int u=p2(q.top());
double sw=p1(q.top());
q.pop();
if(d[u]!=sw)continue;
for(auto e:g[u]){
int v=e.v;
double w=e.w;
if(d[v]>sw+w){
d[v]=sw+w;
pre[v]=e.id;
q.push({d[v],v});
}
}
}
}
inline void INIT(){
cin>>n>>m>>K;
for(int i=1;i<=m;i++){
int u,v;
double w=0;
cin>>u>>v>>w;
add(u,v,w);
}
dij();
for(int i=1;i<n;i++)
p[pre[i]]=1;
for(int i=1;i<=cnt;i++)if(!p[i]){
int u=E[i].u,v=E[i].v;
double w=E[i].w;
G[u].push_back({v,0,d[v]-d[u]+w});
}
for(int i=1;i<n;i++)
rt[i]=BD(G[i]),f[E[pre[i]].v].push_back(i);
dfs(n);
}
int ct[20030];
inline void calc(){
priority_queue<pii,vector<pii>,greater<pii>>q;
t(0)=1;
q.push({d[1],0});
int cnt=0;
while(!q.empty()){
double sw=p1(q.top());
int x=p2(q.top());
q.pop();
if(sw>K)break;
K-=sw;
// cout<<K<<endl;
// ct[(int)sw]++;
cnt++;
if(t(x)!=n){
// if(rt[t(x)]==0)cout<<t(x)<<endl;
q.push({sw+w(rt[t(x)]),rt[t(x)]});
}
if(ls(x))
q.push({sw-w(x)+w(ls(x)),ls(x)});
if(rs(x))
q.push({sw-w(x)+w(rs(x)),rs(x)});
}
cout<<cnt<<endl;
// int P=0;
// for(int i=1;ct[i];i+=2)
// cout<<i<<" "<<ct[i]<<endl,P+=i*ct[i];
// cout<<P<<endl;
}
signed main(){
ios::sync_with_stdio(0);
// freopen("P2483_3.in","r",stdin);
// freopen("b.out","w",stdout);
INIT();
calc();
cout.flush();
return 0;
}