#include <iostream>
#include <map>
#include <vector>
#include <climits>
#include <stack>
#include <string>
#include <queue>
#include <algorithm>
#include <set>
#include <unordered_set>
#include <iostream>
#include <unordered_map>
#include <cmath>
#include <cctype>
#include <bitset>
#include <iomanip>
#include <cstring>
using namespace std;
#define int long long
#define pii pair<int, int>
#define mp make_pair
#define pb push_back
#define fi first
#define se second
int n, dj[30005];
vector<int> graph[30005];
bool have[30005][185];
int dijk(int start, int end){
for (int i=0; i<n; ++i)dj[i]=LLONG_MAX/2;
priority_queue<pii, vector<pii>, greater<pii> > pq;
dj[start]=0;
pq.push(mp(0, start));
while (!pq.empty()){
int d=pq.top().fi, cnode = pq.top().se;
pq.pop();
if (d>dj[cnode])continue;
for (auto num:graph[cnode]){
for (int i=1; cnode+i*num<n; ++i){
if (dj[cnode]+i<dj[cnode+i*num]){
dj[cnode+i*num]=dj[cnode]+i;
pq.push(mp(dj[cnode+i*num], cnode+i*num));
}
if (num<180&&have[cnode+i*num][num])break;
}
for (int i=1; cnode-i*num>=0; ++i){
if (dj[cnode]+i<dj[cnode-i*num]){
dj[cnode-i*num]=dj[cnode]+i;
pq.push(mp(dj[cnode-i*num], cnode-i*num));
}
if (num<180&&have[cnode-i*num][num])break;
}
}
}
return (dj[end]==LLONG_MAX/2?-1:dj[end]);
}
int32_t main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int m, start, end, a, b;
cin>>n>>m;
for (int i=0; i<m; ++i){
cin>>a>>b;
if (!i)start=a;
else if (i==1)end=a;
if (b>=180||!have[a][b])graph[a].pb(b);
if (b<180)have[a][b]=1;
}
cout<<dijk(start, end);
}
# | 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... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |