이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef vector<ll> vl ;
#define mp make_pair
#define pb push_back
#define f first
#define s second
#define all(v) (v).begin(),(v).end()
const int MOD = 1000000007;
const int N = 1000005;
const double PI =4*atan(1);
const double eps = 1e-7;
ll n,m;
ll x,y;
vl tab[N];
ll p[N];
ll b[N];
bool vis[N];
unordered_map<ll ,ll> maa;
ll ans=-1;
void bfs(ll u){
deque<pair<ll,ll> > pq;
for(auto t:tab[u]){
pq.push_back(mp(0,u*50000 + p[t]));
}
vis[u]=1;
pair<ll,ll> ras;
while(!pq.empty()){
ras=pq.front();
pq.pop_front();
ll x=ras.s/50000;
ll y=ras.s%50000;
if(x==b[1]){
ans=max(ans,-ras.f);
continue ;
}
//cout << x << " " << y << endl;
ll z=maa[50000*(x+y)+y];
if(x+y <n && (z==0 || (z!=0 && -ras.f+1<z))){
maa[50000*(x+y)+y]=-ras.f+1;
if(x+y == b[1]){
ans=max(ans,-ras.f+1);
continue;;
}
pq.push_back(mp(ras.f-1,50000*(x+y)+y));
}
z=maa[50000*(x-y)+y];
if(x-y >=0 && (z==0 || (z!=0 && -ras.f+1<z))){
maa[50000*(x-y)+y]=-ras.f+1;
if(x-y == b[1]){
ans=max(ans,-ras.f+1);
continue;
}
pq.push_back(mp(ras.f-1,50000*(x-y)+y));
}
//cout << x << endl;
if(vis[x])continue;
for(auto t: tab[x]){
z=maa[x*50000+p[t]];
if(z==0 || (z!=0 && -ras.f+1 <z)){
pq.push_front(mp(ras.f,x*50000+p[t] ));
maa[x*50000+p[t]]=-ras.f+1;
}
}
vis[x]=1;
}
}
int main(){
ios::sync_with_stdio(0);
//freopen("easy.txt","r",stdin);
cin >> n >>m ;
for(int i=0;i<m;i++){
cin >> x >> y;
p[i]=y;
b[i]=x;
tab[x].pb(i);
}
//cout << b[0]<< endl;
bfs(b[0]);
cout << ans;
return 0;
}
# | 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... |