#include<bits/stdc++.h>
#define taskname "B"
using namespace std;
typedef long long ll;
const int lim = 2e5 + 5;
const ll INF = 1e18;
template<class T>bool minimize(T& a, T b){
if(a > b){
a = b;
return true;
}
return false;
}
int n, m, s, t, L;
ll K;
namespace sub2{
void solve(){
vector<vector<ll>>d(n + 1, vector<ll>(n + 1, INF));
for(int i = 0; i < m; i++){
int u, v, w;
cin >> u >> v >> w;
d[u][v] = d[v][u] = w;
}
int ans = 0;
for(int i = 1; i < n; i++){
for(int j = n; j > i; j--){
vector<vector<ll>>_d = d;
minimize(_d[i][j], ll(L));
minimize(_d[j][i], ll(L));
for(int k = 1; k <= n; k++){
for(int u = 1; u <= n; u++){
for(int v = 1; v <= n; v++){
minimize(_d[u][v], _d[u][k] + _d[k][v]);
}
}
}
if(_d[s][t] <= K){
ans++;
}
}
}
cout << ans;
}
}
vector<pair<int, int>>g[lim];
vector<ll>dijkstra(int start){
vector<ll>d(n + 1, INF);
priority_queue<pair<ll, int>, vector<pair<ll, int>>, greater<pair<ll, int>>>pq;
pq.emplace(d[start] = 0, start);
while(!pq.empty()){
auto [ud, u] = pq.top();
pq.pop();
if(ud == d[u]){
for(auto& [v, w] : g[u]){
if(minimize(d[v], ud + w)){
pq.emplace(d[v], v);
}
}
}
}
return d;
}
namespace sub3{
void solve(){
vector<vector<ll>>d(n + 1);
for(int i = 1; i <= n; i++){
d[i] = dijkstra(i);
}
if(d[s][t] <= K){
return void(cout << ((n * (n - 1)) >> 1));
}
int ans = 0;
for(int i = 1; i < n; i++){
for(int j = n; j > i; j--){
if(min(d[s][i] + d[j][t], d[s][j] + d[i][t]) + L <= K){
ans++;
}
}
}
cout << ans;
}
}
namespace sub14{
void solve(){
vector<ll>ds = dijkstra(s), dt = dijkstra(t);
if(ds[t] <= K){
return void(cout << ((1LL * n * (n - 1)) >> 1LL));
}
sort(ds.begin(), ds.end());
sort(dt.begin(), dt.end());
ll ans = 0;
for(int i = 0, j = n - 1; i < n; i++){
while(j > -1 && ds[i] + dt[j] + L > K){
j--;
}
ans += j + 1;
}
cout << ans;
}
}
int main(){
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
if(fopen(taskname".inp", "r")){
freopen(taskname".inp", "r", stdin);
}
cin >> n >> m >> s >> t >> L >> K;
if(n <= 50 && m <= 50){
sub2::solve();
}
else{
for(int i = 0; i < m; i++){
int u, v, w;
cin >> u >> v >> w;
g[u].emplace_back(v, w);
g[v].emplace_back(u, w);
}
if(n <= 3000){
sub3::solve();
}
else{
sub14::solve();
}
}
}
컴파일 시 표준 에러 (stderr) 메시지
Main.cpp: In function 'int main()':
Main.cpp:104:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
104 | freopen(taskname".inp", "r", stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
# | 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... |