結果

提出番号 2133
提出者 ikd
言語 C++
提出日時 2018-08-04 16:18:51
問題名 (73)観光計画
結果 AC
点数 100%

テストケース

テストケース 結果 得点 実行時間 メモリ使用量
1 AC 100% 117ms 22752KB
2 AC 100% 138ms 27952KB
3 AC 100% 62ms 19152KB
4 AC 100% 186ms 31296KB
5 AC 100% 97ms 18816KB
6 AC 100% 160ms 28272KB
7 AC 100% 188ms 36896KB
8 AC 100% 174ms 39248KB
9 AC 100% 82ms 15920KB
10 AC 100% 189ms 44752KB
11 AC 100% 101ms 21440KB
12 AC 100% 32ms 16000KB
13 AC 100% 91ms 27552KB
14 AC 100% 181ms 35696KB
15 AC 100% 153ms 34688KB
16 AC 100% 135ms 25824KB
17 AC 100% 200ms 44000KB
18 AC 100% 152ms 28288KB
19 AC 100% 30ms 19344KB
20 AC 100% 99ms 29680KB
21 AC 100% 56ms 13392KB
22 AC 100% 78ms 22112KB
23 AC 100% 94ms 23360KB
24 AC 100% 230ms 50048KB
25 AC 100% 185ms 40960KB
26 AC 100% 207ms 37664KB
27 AC 100% 53ms 16976KB
28 AC 100% 51ms 13504KB
29 AC 100% 117ms 25648KB
30 AC 100% 92ms 30608KB
31 AC 100% 223ms 46208KB
32 AC 100% 141ms 24560KB
33 AC 100% 26ms 12048KB
34 AC 100% 170ms 33408KB
35 AC 100% 29ms 11328KB
36 AC 100% 178ms 36224KB
37 AC 100% 87ms 20032KB
38 AC 100% 20ms 8528KB
39 AC 100% 235ms 44752KB
40 AC 100% 30ms 14864KB
41 AC 100% 220ms 36192KB
42 AC 100% 57ms 17024KB
43 AC 100% 271ms 45008KB
44 AC 100% 144ms 27376KB
45 AC 100% 156ms 32800KB
46 AC 100% 159ms 29440KB
47 AC 100% 189ms 37120KB
48 AC 100% 227ms 37104KB
49 AC 100% 124ms 23232KB
50 AC 100% 180ms 37248KB
51 AC 100% 52ms 12704KB
52 AC 100% 114ms 22960KB
53 AC 100% 70ms 18432KB
54 AC 100% 163ms 25984KB
55 AC 100% 43ms 16352KB
56 AC 100% 108ms 31264KB
57 AC 100% 73ms 28608KB
58 AC 100% 87ms 23600KB
59 AC 100% 45ms 21328KB
60 AC 100% 62ms 18032KB
61 AC 100% 91ms 21680KB
62 AC 100% 197ms 31760KB
63 AC 100% 161ms 37696KB
64 AC 100% 181ms 35840KB
65 AC 100% 158ms 33040KB
66 AC 100% 4ms 9504KB
67 AC 100% 117ms 31184KB
68 AC 100% 112ms 32016KB
69 AC 100% 280ms 52912KB
70 AC 100% 142ms 27840KB

ソースコード

#include<iostream>
#include<vector>
#include<algorithm>
#include<numeric>
#include<queue>
using namespace std;

#define rep(i,n) for(int i=0;i<(n);i++)

int main(){

  struct Edge{
    int to, cost;
    Edge(int t, int c): to(t), cost(c){}
  };

  int n, m, k; cin>> n>> m>> k;
  vector<vector<Edge>> g(n+1);
  rep(i, m){
    int a, b, c; cin>> a>> b>> c;
    a--; b--;
    g[a].push_back(Edge{b, c});
    g[b].push_back(Edge{a, c});
  }
  vector<int> h(k), d(k);
  rep(i, k) cin>> h[i]>> d[i];

  // int mxd=*max_element(d.begin(), d.end());
  int mxd=1e9;
  rep(i, k) g[n].push_back(Edge{h[i]-1, mxd-d[i]});
  using i64=long long;
  i64 inf=1e18;
  vector<i64> dist(n+1, inf);
  struct P{
    int v; i64 d;
    P(int v, i64 d): v(v), d(d){}
    bool operator<(const P &r)const{
      return d>r.d;
    }
  };
  priority_queue<P> q;
  q.push(P{n, 0}); dist[n]=0;
  while(q.size()>0){
    auto p=q.top(); q.pop();
    for(auto e: g[p.v]){
      if(dist[p.v]+e.cost<dist[e.to]){
        dist[e.to]=dist[p.v]+e.cost;
        q.push(P{e.to, dist[e.to]});
      }
    }
  }
  auto count=[&](){
    int cnt=0;
    rep(i, n)if(dist[i]<=mxd) cnt++;
    return cnt;
  };

  cout<< count()<< endl;
  return 0;
}