首先吐槽这次比赛题目描述真的太冗长了 单说这个题目还是很好的(尽管很简单)
首先不难想到最短路 肯定是从靠近源点到远离源点的顺序去走
每次走的下限可以不管 因为可以在一条路上来回走
因为要求每天多走一条新边 所以我们考虑每条边
如果这条边的其中一点乘2(保证来回)小于上限 那么肯定就有多的步伐走这条边
#include<bits/stdc++.h>
using namespace std;
#define lowbit(x) x&(-x)
#define ll long long
int n,m,L,R,cnt;
const int maxn=1e5+5;
int head[maxn],dp[maxn],vis[maxn];
struct ed{
int u,to,next,w;
}edg[maxn<<1];
void add(int u,int v,int w){
edg[++cnt].next=head[u];head[u]=cnt;edg[cnt].to=v;edg[cnt].u=u;edg[cnt].w=w;
}
void spfa();
int main(){
cin>>n>>m>>L>>R;
for(int i=1;i<=m;i++){
int aa,bb,cc;
cin>>aa>>bb>>cc;
add(aa,bb,cc);
add(bb,aa,cc);
}
spfa();
int ans=0;
for(int i=1;i<=cnt;i++){
int u=edg[i].u,v=edg[i].to;
if((min(dp[u],dp[v])*2)<R)
ans++;
}
cout<<ans/2;
return 0;
}
void spfa(){
queue<int>Q;
memset(dp,0x7f,sizeof(dp));
vis[0]=1;dp[0]=0;
Q.push(0);
while(!Q.empty()){
int u=Q.front();
Q.pop();
vis[u]=0;
for(int i=head[u];i;i=edg[i].next){
int to=edg[i].to,w=edg[i].w;
if(dp[to]>dp[u]+w){
dp[to]=dp[u]+w;
if(!vis[to])vis[to]=1,Q.push(to);
}
}
}
}