#include<bits/stdc++.h>
using namespace std;
const int N=100005;
int n,s,l,r,f[N];
vector<pair<int,int>> vec[N];
set<pair<int,int>> st;
void dijkstra(){
priority_queue< pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>> > pq;
bool vis[N]={}; memset(f,0x3f,sizeof(f));
pq.push({0,0}); f[0]=0;
while(!pq.empty()){
int n1=pq.top().first,n2=pq.top().second; pq.pop();
if(vis[n1]) continue; vis[n1]=1;
for(int i=0;i<vec[n1].size();i++){
int nx1=vec[n1][i].first,nx2=vec[n1][i].second;
if(f[n1]+nx2<f[nx1]){
f[nx1]=f[n1]+nx2;
pq.push({nx1,f[nx1]});
}
}
}
}
int main(){
cin>>n>>s>>l>>r;
for(int i=1;i<=s;i++){
int u,v,w; cin>>u>>v>>w;
vec[u].push_back({v,w});
vec[v].push_back({u,w});
}
dijkstra();
int ans=0;
for(int i=0;i<=n-1;i++){
for(int j=0;j<vec[i].size();j++){//枚举边
int k=vec[i][j].first;//该条边的目的地
if(st.count({i,k})) continue;
if(min(f[i],f[k])*2<r){
ans++;
st.insert({i,k});
st.insert({k,i});
}
}
}
cout<<ans<<endl;
return 0;
}
大致思路是用dijkstra跑出起点到每个点的最短路,随后枚举每条边判断是否能在规定的总路程之内往返
使用了一个set筛去已经判断完的边