Submission #4065811


Source Code Expand

#include <bits/stdc++.h>

using namespace std;

#define pb push_back
#define mp make_pair
#define mt make_tuple
#define fi first
#define se second
#define all(a) (a).begin(),(a).end()
#define endl "\n"
#define rep(i, a, b) for (auto (i) = (a); (i) < (b); (i)++)
#define rrep(i, a, b) for (auto (i) = (a); (i) > (b); (i)--)

#define aim_cpo do{ios::sync_with_stdio(false);\
cin.tie(nullptr);cout.precision(12);cout<<fixed;}while(0)

#define LOCAL_INPUT do{FILE *stream1;\
stream1=freopen("/Users/aim_cpo/CLionProjects/competitive/in.txt","r",stdin);\
if(stream1==nullptr)return 0;}while(0)
#define LOCAL_OUTPUT do{FILE *stream2;\
stream2 = freopen("out.txt", "w", stdout);\
if (stream2 == nullptr) return 0;}while(0)

#ifdef LOCAL_DEFINE
#define show(x) cerr << #x << " = " << (x) << endl
#define showV(v, n) do{\
for(int _i_t_e_=0; _i_t_e_<(n);_i_t_e_++)\
cerr<<"("<<_i_t_e_<<" = "<<(v)[_i_t_e_]<<") ";\
cerr<<endl;}while(0)
#define showA(a, n) do{\
for(int _i_t_e_=0;_i_t_e_<(n);_i_t_e_++)\
cerr<<"("<<_i_t_e_<<" = "<<(a)[_i_t_e_]<<") ";\
cerr<<endl;}while(0)
#define showA2(a, n, m) do{\
for(int _i_t_e_=0;_i_t_e_<(n);_i_t_e_++){\
for(int _i_t_e_2=0;_i_t_e_2<(m);_i_t_e_2++){\
cerr<<"("<<_i_t_e_<<", "<<_i_t_e_2<<" = "<<(a)[_i_t_e_][_i_t_e_2]<<") ";\
}cerr<<endl;}cerr<<endl;}while(0)
#else
#define show(x)
#define showV(v, n)
#define showA(a, n)
#define showA2(a, n, m)
#endif

typedef long long ll;
typedef unsigned long long ull;

constexpr const int INT_INF=0x3f3f3f3f; //1061109567
constexpr const ll LL_INF=0x3f3f3f3f3f3f3f3f; //4557430888798830399

template <typename T> bool chmin(T &a, T b){return a>b?(a=b,true):false;}
template <typename T> bool chmax(T &a, T b){return a<b?(a=b,true):false;}
template <typename T> void ln(T i, T n){cout<<(i==n-1?"\n":" ");}
template <typename T, typename S>
ostream &operator<<(ostream &out,const pair<T, S> &pair1){
  out<<'('<<pair1.fi<<", "<<pair1.se<<')';return out;}

// INT
#define GCD(a, b) __gcd(a, b)
template <typename T> T LCM(T a, T b) {return a / GCD(a, b) * b;}
template <typename T> T EXTGCD(T a, T b, T& x, T& y) {
  T d = a;
  if (b != 0) {d=EXTGCD(b,a%b,y,x);y-=(a/b)*x;}
  else x=1,y=0;
  return d;
}
template <typename T> bool is_prime(T a) {
  for(int i=2;i*i<=a;i++)if(a%i==0)return 1;
  return 0;
}

// MOD
ll MOD = 1000000000L + 7L;
#define add(a, b) ((a % MOD) + (b % MOD)) % MOD
#define mul(a, b) ((a % MOD) * (b % MOD)) % MOD
#define sub(a, b) ((a % MOD) + MOD - (b % MOD)) % MOD
template <typename T> T mod_inverse(T a, T mod, bool prime){ // if mod is prime, "prime" is true.
  if(prime){
    T tmp=mod-2,now=a,res=1;while(tmp){if(tmp&1)res=mul(res,now);now=mul(now,now);tmp>>=1;}
    return res;
  }else{T x,y;EXTGCD(a,mod,x,y);return (mod+x%mod)%mod;}
}
#define divide(a, b) ((a % MOD) * (mod_inverse(b, MOD, true))) % MOD

//LLの数値をつかう時は最後にLをつける癖をつけよう
//
//  ┏┓┏┓ ┓ ┏┓
//  ┏┛┃┃ ┃ ┗┫
//  ┗┛┗┛ ┻ ┗┛
//
//   謹┃賀┃新┃年┃
//   ━┛━┛━┛━┛
//WWWWWWWWWWWWWWWWWWWWWW

int n, m;
vector <pair <int, int> > v[512345];
ll d[512345];

int EdgeNum = 100000;
map <pair<int, int> , int> map1;

void AddEdge(int a, int b, int c) {
  if (map1.find(mp(a, c)) == map1.end()) {
    map1[mp(a, c)] = EdgeNum++;
  }
  if (map1.find(mp(b, c)) == map1.end()) {
    map1[mp(b, c)] = EdgeNum++;
  }
  v[map1[mp(a, c)]].emplace_back(a, 1);
  v[a].emplace_back(map1[mp(a, c)], 1);
  v[map1[mp(a, c)]].emplace_back(map1[mp(b, c)], 0);
  v[map1[mp(b, c)]].emplace_back(map1[mp(a, c)], 0);
  v[map1[mp(b, c)]].emplace_back(b, 1);
  v[b].emplace_back(map1[mp(b, c)], 1);
}

int main() {
  aim_cpo; // インタラクティブのときは消すように.
#ifdef LOCAL_DEFINE
  LOCAL_INPUT; // インタラクティブのときは消すように.
//  LOCAL_OUTPUT; // ファイルに出力したいときのみ
  show(MOD);
#endif
  // テキトー考察
  //
  // わかりやすい解説
  // http://mayokoex.hatenablog.com/entry/2016/09/12/114922
  // 
  // 辺の重さが動的に変化するため、そのままdijkstraやったらだめ.
  // ということで、頂点内に新しく頂点と辺を作ろうと思うのが自然な流れ(多分)
  // ただ、追加する頂点が多いと辺の数がO(M^2)とかになって、やってられない
  // ここで、補助的な頂点をN個作って、なんとかやりくりすることで頂点数が2 * M + N, 辺の数が3 * Mのグラフを
  // 構築することができる.(詳しくは上の解説ブログを見てね)
  // このあとは、dijkstraをやるだけ.
  cin >> n >> m;
  rep(i, 0, m) {
    int from, to, c; cin >> from >> to >> c;
    from--; to--; c--;
    AddEdge(from, to, c);
  }
  fill(d, d + 512345, LL_INF);
  priority_queue<pair<ll, int> > q;
  q.push(mp(0, 0));
  d[0] = 0;
  while (!q.empty()) {
    int now = q.top().se; ll cost = -q.top().fi; q.pop();
    if (d[now] < cost) continue;
    rep(i, 0, (int)v[now].size()) {
      int next = v[now][i].fi;
      ll nextcost = cost + v[now][i].se;
      if (d[next] > nextcost) {
        d[next] = nextcost;
        q.push(mp(-nextcost, next));
      }
    }
  }
  if (d[n - 1] == LL_INF) cout << -1 << endl;
  else {
    cout << d[n - 1] / 2 << endl;
  }
#ifdef  LOCAL_DEFINE
  cerr << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << "s." << endl;
#endif
  return 0;
}

Submission Info

Submission Time
Task E - Snuke's Subway Trip
User aim_cpo
Language C++14 (GCC 5.4.1)
Score 600
Code Size 5556 Byte
Status AC
Exec Time 784 ms
Memory 62960 KB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 600 / 600
Status AC
AC × 59
Set Name Test Cases
Sample
All 01.txt, 02.txt, 03.txt, 04.txt, 05.txt, 06.txt, 07.txt, 08.txt, 09.txt, 10.txt, 11.txt, 12.txt, 13.txt, 14.txt, 15.txt, 16.txt, 17.txt, 18.txt, 19.txt, 20.txt, 21.txt, 22.txt, 23.txt, 24.txt, 25.txt, 26.txt, 27.txt, 28.txt, 29.txt, 30.txt, 31.txt, 32.txt, 33.txt, 34.txt, 35.txt, 36.txt, 37.txt, 38.txt, sample_01.txt, sample_02.txt, sample_03.txt, w1.txt, w10.txt, w11.txt, w12.txt, w13.txt, w14.txt, w15.txt, w16.txt, w17.txt, w18.txt, w2.txt, w3.txt, w4.txt, w5.txt, w6.txt, w7.txt, w8.txt, w9.txt
Case Name Status Exec Time Memory
01.txt AC 7 ms 16256 KB
02.txt AC 503 ms 38524 KB
03.txt AC 784 ms 61560 KB
04.txt AC 643 ms 59136 KB
05.txt AC 698 ms 52088 KB
06.txt AC 254 ms 36992 KB
07.txt AC 325 ms 38528 KB
08.txt AC 729 ms 61560 KB
09.txt AC 342 ms 40960 KB
10.txt AC 345 ms 40832 KB
11.txt AC 392 ms 42484 KB
12.txt AC 144 ms 28776 KB
13.txt AC 310 ms 34804 KB
14.txt AC 390 ms 43512 KB
15.txt AC 330 ms 38132 KB
16.txt AC 365 ms 39924 KB
17.txt AC 403 ms 42612 KB
18.txt AC 232 ms 31988 KB
19.txt AC 384 ms 39900 KB
20.txt AC 468 ms 44532 KB
21.txt AC 675 ms 62960 KB
22.txt AC 499 ms 46196 KB
23.txt AC 568 ms 50808 KB
24.txt AC 395 ms 42744 KB
25.txt AC 135 ms 28020 KB
26.txt AC 276 ms 34548 KB
27.txt AC 402 ms 45304 KB
28.txt AC 403 ms 44308 KB
29.txt AC 413 ms 45052 KB
30.txt AC 400 ms 42996 KB
31.txt AC 285 ms 34808 KB
32.txt AC 379 ms 39664 KB
33.txt AC 418 ms 45556 KB
34.txt AC 374 ms 38524 KB
35.txt AC 122 ms 28276 KB
36.txt AC 240 ms 31992 KB
37.txt AC 388 ms 39540 KB
38.txt AC 356 ms 38260 KB
sample_01.txt AC 7 ms 16256 KB
sample_02.txt AC 7 ms 16256 KB
sample_03.txt AC 6 ms 16256 KB
w1.txt AC 369 ms 39976 KB
w10.txt AC 701 ms 59136 KB
w11.txt AC 212 ms 28488 KB
w12.txt AC 330 ms 32256 KB
w13.txt AC 550 ms 41600 KB
w14.txt AC 642 ms 56064 KB
w15.txt AC 89 ms 28732 KB
w16.txt AC 204 ms 29184 KB
w17.txt AC 295 ms 30720 KB
w18.txt AC 451 ms 36864 KB
w2.txt AC 366 ms 39840 KB
w3.txt AC 508 ms 46928 KB
w4.txt AC 416 ms 41584 KB
w5.txt AC 721 ms 60916 KB
w6.txt AC 603 ms 52084 KB
w7.txt AC 678 ms 57796 KB
w8.txt AC 706 ms 57216 KB
w9.txt AC 656 ms 57984 KB