結果

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

テストケース

テストケース 結果 得点 実行時間 メモリ使用量
1 AC 100% 122ms 22752KB
2 AC 100% 125ms 27936KB
3 AC 100% 60ms 19168KB
4 AC 100% 190ms 31296KB
5 AC 100% 86ms 18832KB
6 AC 100% 133ms 28288KB
7 AC 100% 160ms 36912KB
8 AC 100% 179ms 39264KB
9 AC 100% 77ms 15920KB
10 AC 100% 230ms 44736KB
11 AC 100% 90ms 21424KB
12 AC 100% 32ms 15984KB
13 AC 100% 76ms 27568KB
14 AC 100% 203ms 35712KB
15 AC 100% 156ms 34704KB
16 AC 100% 140ms 25808KB
17 AC 100% 189ms 44000KB
18 AC 100% 135ms 28288KB
19 AC 100% 29ms 19344KB
20 AC 100% 96ms 29680KB
21 AC 100% 54ms 13392KB
22 AC 100% 91ms 22112KB
23 AC 100% 97ms 23360KB
24 AC 100% 223ms 50064KB
25 AC 100% 158ms 40960KB
26 AC 100% 203ms 37664KB
27 AC 100% 46ms 16976KB
28 AC 100% 53ms 13504KB
29 AC 100% 130ms 25648KB
30 AC 100% 94ms 30608KB
31 AC 100% 234ms 46192KB
32 AC 100% 117ms 24560KB
33 AC 100% 30ms 12032KB
34 AC 100% 192ms 33392KB
35 AC 100% 25ms 11312KB
36 AC 100% 182ms 36224KB
37 AC 100% 88ms 20032KB
38 AC 100% 18ms 8736KB
39 AC 100% 238ms 44752KB
40 AC 100% 26ms 14864KB
41 AC 100% 191ms 36208KB
42 AC 100% 53ms 17008KB
43 AC 100% 213ms 45024KB
44 AC 100% 135ms 27392KB
45 AC 100% 151ms 32816KB
46 AC 100% 147ms 29440KB
47 AC 100% 197ms 37104KB
48 AC 100% 192ms 37120KB
49 AC 100% 107ms 23216KB
50 AC 100% 176ms 37216KB
51 AC 100% 48ms 12720KB
52 AC 100% 115ms 22960KB
53 AC 100% 66ms 18448KB
54 AC 100% 155ms 25984KB
55 AC 100% 39ms 16336KB
56 AC 100% 115ms 31280KB
57 AC 100% 66ms 28624KB
58 AC 100% 76ms 23584KB
59 AC 100% 49ms 21328KB
60 AC 100% 61ms 18032KB
61 AC 100% 78ms 21664KB
62 AC 100% 162ms 31744KB
63 AC 100% 151ms 37696KB
64 AC 100% 170ms 35856KB
65 AC 100% 156ms 33040KB
66 AC 100% 5ms 9488KB
67 AC 100% 95ms 31200KB
68 AC 100% 99ms 32016KB
69 AC 100% 293ms 52896KB
70 AC 100% 145ms 27856KB

ソースコード

#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());
  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;
}