結果

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

テストケース

テストケース 結果 得点 実行時間 メモリ使用量
1 AC 100% 123ms 33056KB
2 AC 100% 121ms 38368KB
3 AC 100% 65ms 22688KB
4 AC 100% 195ms 47296KB
5 AC 100% 99ms 28384KB
6 AC 100% 159ms 42896KB
7 AC 100% 192ms 49184KB
8 AC 100% 176ms 50240KB
9 AC 100% 78ms 25424KB
10 AC 100% 198ms 61104KB
11 AC 100% 105ms 29712KB
12 AC 100% 37ms 17616KB
13 AC 100% 90ms 31776KB
14 AC 100% 206ms 51840KB
15 AC 100% 169ms 43152KB
16 AC 100% 150ms 40736KB
17 AC 100% 190ms 55200KB
18 AC 100% 148ms 39008KB
19 AC 100% 37ms 21424KB
20 AC 100% 85ms 33328KB
21 AC 100% 57ms 21248KB
22 AC 100% 92ms 27824KB
23 AC 100% 84ms 29408KB
24 AC 100% 229ms 66080KB
25 AC 100% 194ms 53520KB
26 AC 100% 221ms 54880KB
27 AC 100% 52ms 19536KB
28 AC 100% 53ms 18064KB
29 AC 100% 144ms 36528KB
30 AC 100% 93ms 34848KB
31 AC 100% 256ms 60800KB
32 AC 100% 119ms 37808KB
33 AC 100% 29ms 13744KB
34 AC 100% 196ms 49552KB
35 AC 100% 29ms 13024KB
36 AC 100% 183ms 48112KB
37 AC 100% 87ms 26432KB
38 AC 100% 18ms 10128KB
39 AC 100% 212ms 60592KB
40 AC 100% 31ms 16496KB
41 AC 100% 216ms 53632KB
42 AC 100% 52ms 20832KB
43 AC 100% 256ms 62032KB
44 AC 100% 134ms 37824KB
45 AC 100% 132ms 42720KB
46 AC 100% 163ms 42368KB
47 AC 100% 234ms 55584KB
48 AC 100% 235ms 55440KB
49 AC 100% 128ms 35904KB
50 AC 100% 157ms 48224KB
51 AC 100% 49ms 17200KB
52 AC 100% 123ms 32640KB
53 AC 100% 60ms 22368KB
54 AC 100% 140ms 42224KB
55 AC 100% 47ms 17936KB
56 AC 100% 129ms 38816KB
57 AC 100% 62ms 31680KB
58 AC 100% 90ms 29392KB
59 AC 100% 53ms 23520KB
60 AC 100% 64ms 21520KB
61 AC 100% 90ms 26960KB
62 AC 100% 193ms 47312KB
63 AC 100% 143ms 45584KB
64 AC 100% 173ms 51232KB
65 AC 100% 181ms 46320KB
66 AC 100% 5ms 8576KB
67 AC 100% 100ms 35408KB
68 AC 100% 101ms 37584KB
69 AC 100% 298ms 72784KB
70 AC 100% 144ms 39856KB

ソースコード

#include<iomanip>
#include<limits>
#include<thread>
#include<utility>
#include<iostream>
#include<string>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<stack>
#include<queue>
#include<cmath>
#include<numeric>
#include<cassert>
#include<random>
#include<chrono>
#include<unordered_map>
#include<list>
using namespace std;
typedef unsigned long long int ull;
typedef long long int ll;
typedef pair<ll,ll> pll;
typedef pair<int,int> pi;
typedef pair<double,double> pd;
typedef pair<double,ll> pdl;
#define F first
#define S second
#define MK make_pair
const ll E=1e18+7;
const ll MOD=1000000007;

template<typename T>
class Dijkstra{
private:
    typedef pair<T,ll> edge; //cost,to
    typedef edge node;
    typedef pair<T,vector<ll>> pass;
    
    template<typename U>
    vector<U> pls(vector<U> a,vector<U> b){
        for(int i=0;i<b.size();i++){a.push_back(b[i]);}
        return a;
    }
    
    template<typename U>
    vector<U> pls(vector<U> a,U b){
        a.push_back(b);
        return a;
    }
    
    ll v;
    vector<vector<edge>> E;
    T err;
public:
    Dijkstra(ll v,T err):v(v),err(err){E.resize(v);}
    
    void add_edge(ll from,ll to,T cost){
        E[from].push_back({cost,to});
    }
    
    //MLE注意
    pass pass_search(ll root,ll to){
        return pass_search(root)[to];
    }
    
    //MLE注意
    vector<pass> pass_search(ll root){
        vector<pass> ret(v,{err,vector<ll>()});
        ret[root]={0,{root}};
        priority_queue<node,vector<node>,greater<node>> q;
        q.push({0,root});
        vector<bool> used(v,false);
        while(!q.empty()){
            node where=q.top();
            q.pop();
            if(used[where.S]){continue;}
            used[where.S]=true;
            for(int i=0;i<E[where.S].size();i++){
                if(ret[E[where.S][i].S].F>where.F+E[where.S][i].F){
                    ret[E[where.S][i].S].F=where.F+E[where.S][i].F;
                    ret[E[where.S][i].S].S=pls(ret[where.S].S,where.S);
                    q.push({ret[E[where.S][i].S].F,E[where.S][i].S});
                }
            }
        }
        return ret;
    }
    
    vector<T> search(ll root){
        vector<T> ret(v,err);
        ret[root]=0;
        priority_queue<node,vector<node>,greater<node>> q;
        q.push({0,root});
        vector<bool> used(v,false);
        while(!q.empty()){
            node where=q.top();
            q.pop();
            if(used[where.S]){continue;}
            used[where.S]=true;
            for(int i=0;i<E[where.S].size();i++){
                if(ret[E[where.S][i].S]>where.F+E[where.S][i].F){
                    ret[E[where.S][i].S]=where.F+E[where.S][i].F;
                    q.push({ret[E[where.S][i].S],E[where.S][i].S});
                }
            }
        }
        return ret;
    }
    
    T search(ll root,ll to){return search(root)[to];}
};


int main(){
    ll n,m,k;
    cin>>n>>m>>k;
    Dijkstra<ll> D(n+1,E);
    for(int i=0;i<m;i++){
        ll a,b,c;
        cin>>a>>b>>c;
        D.add_edge(a,b,c);
        D.add_edge(b,a,c);
    }
    for(int i=0;i<k;i++){
        ll w,c;
        cin>>w>>c;
        D.add_edge(0,w,-1*c);
    }
    vector<ll> ans=D.search(0);
    ll count=0;
    for(int i=1;i<=n;i++){
        if(ans[i]<=0){count++;}
    }
    cout<<count<<endl;
    
    return 0;
}