結果

提出番号 1762
提出者 haji
言語 C++
提出日時 2018-08-04 13:46:40
問題名 (73)観光計画
結果 AC
点数 100%

テストケース

テストケース 結果 得点 実行時間 メモリ使用量
1 AC 100% 58ms 34240KB
2 AC 100% 71ms 40832KB
3 AC 100% 30ms 24592KB
4 AC 100% 78ms 49152KB
5 AC 100% 40ms 29232KB
6 AC 100% 64ms 44752KB
7 AC 100% 78ms 51968KB
8 AC 100% 90ms 53760KB
9 AC 100% 33ms 25392KB
10 AC 100% 104ms 63728KB
11 AC 100% 48ms 31056KB
12 AC 100% 16ms 19376KB
13 AC 100% 44ms 34848KB
14 AC 100% 91ms 54896KB
15 AC 100% 76ms 47728KB
16 AC 100% 81ms 42032KB
17 AC 100% 104ms 59936KB
18 AC 100% 54ms 40992KB
19 AC 100% 18ms 23680KB
20 AC 100% 41ms 37904KB
21 AC 100% 22ms 21200KB
22 AC 100% 44ms 29952KB
23 AC 100% 46ms 31360KB
24 AC 100% 133ms 71536KB
25 AC 100% 86ms 56560KB
26 AC 100% 98ms 56800KB
27 AC 100% 26ms 21104KB
28 AC 100% 21ms 18608KB
29 AC 100% 56ms 38352KB
30 AC 100% 40ms 38640KB
31 AC 100% 109ms 67136KB
32 AC 100% 58ms 39216KB
33 AC 100% 14ms 14640KB
34 AC 100% 129ms 52032KB
35 AC 100% 15ms 13936KB
36 AC 100% 86ms 50576KB
37 AC 100% 40ms 27984KB
38 AC 100% 8ms 10640KB
39 AC 100% 116ms 65120KB
40 AC 100% 13ms 18048KB
41 AC 100% 95ms 56848KB
42 AC 100% 29ms 22256KB
43 AC 100% 112ms 67488KB
44 AC 100% 55ms 39664KB
45 AC 100% 75ms 45840KB
46 AC 100% 75ms 44560KB
47 AC 100% 103ms 57472KB
48 AC 100% 106ms 58704KB
49 AC 100% 54ms 36560KB
50 AC 100% 96ms 52608KB
51 AC 100% 22ms 17632KB
52 AC 100% 45ms 33744KB
53 AC 100% 29ms 24448KB
54 AC 100% 64ms 43072KB
55 AC 100% 21ms 20144KB
56 AC 100% 64ms 41536KB
57 AC 100% 34ms 35008KB
58 AC 100% 42ms 31296KB
59 AC 100% 30ms 26704KB
60 AC 100% 30ms 22928KB
61 AC 100% 42ms 29488KB
62 AC 100% 81ms 49776KB
63 AC 100% 78ms 50640KB
64 AC 100% 78ms 53888KB
65 AC 100% 75ms 49568KB
66 AC 100% 4ms 10672KB
67 AC 100% 53ms 40528KB
68 AC 100% 57ms 41504KB
69 AC 100% 131ms 76800KB
70 AC 100% 59ms 41344KB

ソースコード

#include <bits/stdc++.h>
#define GET_MACRO(_1,_2,_3,_4,_5,_6,_7,_8,NAME,...) NAME
#define pr(...) cerr<< GET_MACRO(__VA_ARGS__,pr8,pr7,pr6,pr5,pr4,pr3,pr2,pr1)(__VA_ARGS__) <<endl
#define pr1(a) (#a)<<"="<<(a)<<" "
#define pr2(a,b) pr1(a)<<pr1(b)
#define pr3(a,b,c) pr1(a)<<pr2(b,c)
#define pr4(a,b,c,d) pr1(a)<<pr3(b,c,d)
#define pr5(a,b,c,d,e) pr1(a)<<pr4(b,c,d,e)
#define pr6(a,b,c,d,e,f) pr1(a)<<pr5(b,c,d,e,f)
#define pr7(a,b,c,d,e,f,g) pr1(a)<<pr6(b,c,d,e,f,g)
#define pr8(a,b,c,d,e,f,g,h) pr1(a)<<pr7(b,c,d,e,f,g,h)
using namespace std;
using Int = long long;
using _int = int;
using ll = long long;
using Double = long double;
const Int INF = (1LL<<55)+1e9; // ~ 3.6 * 1e16
const Int mod = (1e9)+7;
const Double EPS = 1e-8;
const Double PI = 6.0 * asin((Double)0.5);
using P = pair<Int,Int>;
using T = tuple<Int,Int,Int>;
template<class T> T Max(T &a,T b){return a=max(a,b);}
template<class T> T Min(T &a,T b){return a=min(a,b);}
ostream& operator<<(ostream& o,P p){return o<<"("<<p.first<<","<<p.second<<")";}
ostream& operator<<(ostream& o,T t){return o<<"("<<get<0>(t)<<","<<get<1>(t)<<","<<get<2>(t)<<")";}
istream& operator>>(istream& i,P &p){return i>>p.first>>p.second;}
template<class T> ostream& operator<<(ostream& o,vector<T> &a){Int i=0;for(auto t:a)o<<(i++?" ":"")<<t;return o;}
template<class T> istream& operator>>(istream& i,vector<T> &a){for(auto &t:a)i>>t;return i;}
template<class T> void prArr(T a,string s=" "){Int i=0;for(auto t:a)cout<<(i++?s:"")<<t;cout<<endl;}

class Dijkstra{
public:
  
  typedef tuple<Int,Int> T;
  long long INF = 1LL<<55;
  Int V;
  vector<vector<T> > G;
  
  
  Dijkstra():V(-1){}
  Dijkstra(Int V):V(V),G(V){}
  
  void add_edge(Int a,Int b,Int c){
    assert(a >= 0 && b >= 0);
    assert(a < V && b < V);
    G[a].push_back(T(b,c));
    G[b].push_back(T(a,c));
  }

  vector<Int> dijkstra(vector<P> start){
    vector<Int> D(V,-INF);
    vector<Int> visited(V,0);
    priority_queue<T> Q;
    
    for(auto p:start){
      Int s = p.first-1;
      Int d = p.second;
      Q.push(T(d,s));
      Max(D[s],d);
    }
    
    while(!Q.empty()){
      Int cost, pos;
      tie(cost,pos) = Q.top(); Q.pop();

      assert(!visited[pos] || D[pos] >= cost);
      if(visited[pos]++) continue;

      for(auto t:G[pos]){
        Int to = get<0>(t);
        Int ncost = cost - get<1>(t);
        if(D[to] >= ncost) continue;
        D[to] = ncost;
        Q.push(T(ncost,to));
      }
    }
    return D;
  }
};


signed main(){
  srand((unsigned)time(NULL));
  cin.tie(0);
  ios_base::sync_with_stdio(0);
  cout << fixed << setprecision(12);

  Int n, m, K;
  cin>>n>>m>>K;
  Dijkstra D(n);
  for(Int i=0;i<m;i++){
    Int a,b,c;
    cin>>a>>b>>c; a--,b--;
    D.add_edge(a, b, c);
  }

  vector<P> start(K);
  cin>>start;
  vector<Int> DD = D.dijkstra(start);

  Int ans = 0;
  for(Int i=0;i<n;i++)
    if(DD[i] >= 0) ans++;

  cout<<ans<<endl;
  
  return 0;
}