#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,l,s,t,k;
const int N=1e6+5;
const long long INF=1e18;
vector<pair<int,int>> g[N];
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> q;
int dist1[N],dist2[N];
void dijkstra(int src,int dist[]){
for(int i=1;i<=n;i++) dist[i]=INF;
dist[src]=0;
q.push({0,src});
while(!q.empty()){
int u=q.top().first;
int v=q.top().second;
q.pop();
if(dist1[v]<u) continue;
for(auto& x:g[v]){
if(dist[x.first]>dist[v]+x.second){
dist[x.first]=dist[v]+x.second;
q.push({dist[x.first],x.first});
}
}
}
}
signed main(){
ios_base::sync_with_stdio(0);cin.tie(0);
cin>>n>>m;cin>>s>>t>>l>>k;
for(int i=1;i<=m;i++){
int u,v,w;cin>>u>>v>>w;
g[u].push_back({v,w});
g[v].push_back({u,w});
}
dijkstra(1,dist1);
dijkstra(n,dist2);
int K=k-1;
if(K<0){
cout<<0;
return 0;
}
vector<int> idx1(n);
iota(idx1.begin(),idx1.end(),1);
sort(idx1.begin(),idx1.end(),[&] (int a,int b){
return dist1[a]<dist1[b];
});
vector<int> idx2=idx1 ;
sort(idx2.begin(),idx2.end(),[&] (int a,int b){
return dist2[a]<dist2[b];
});
int ans=0,j=n-1;
for(int i=0;i<n;i++){
int x=idx1[i];
while(j>=0 and dist1[x]+dist2[idx2[j]]>K) j--;
ans+=(j+1);
if(dist1[x]+dist2[x]<=K) ans--;
}
iota(idx1.begin(),idx1.end(),1);
sort(idx1.begin(),idx1.end(),[&] (int a,int b){
return dist2[a]<dist2[b];
});
sort(idx2.begin(),idx2.end(),[&] (int a,int b){
return dist1[a]<dist1[b];
});
j=n-1;
for(int i=0;i<n;i++){
int x=idx1[i];
while(j >= 0 && dist2[x] + dist1[idx2[j]] > K) j--;
ans += (j+1);
if(dist1[x] + dist2[x] <= K) ans--;
}
cout<<ans/2;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |