結果

提出番号 1967
提出者 T.M
言語 C++
提出日時 2018-08-04 14:45:59
問題名 (73)観光計画
結果 AC
点数 100%

テストケース

テストケース 結果 得点 実行時間 メモリ使用量
1 AC 100% 57ms 28592KB
2 AC 100% 68ms 33440KB
3 AC 100% 33ms 20272KB
4 AC 100% 77ms 40400KB
5 AC 100% 31ms 23376KB
6 AC 100% 65ms 35168KB
7 AC 100% 107ms 46064KB
8 AC 100% 105ms 47936KB
9 AC 100% 33ms 21248KB
10 AC 100% 120ms 55728KB
11 AC 100% 47ms 24912KB
12 AC 100% 13ms 14240KB
13 AC 100% 47ms 28512KB
14 AC 100% 100ms 46496KB
15 AC 100% 75ms 44912KB
16 AC 100% 59ms 33312KB
17 AC 100% 98ms 54416KB
18 AC 100% 69ms 35696KB
19 AC 100% 23ms 19616KB
20 AC 100% 56ms 31824KB
21 AC 100% 19ms 14176KB
22 AC 100% 45ms 24432KB
23 AC 100% 48ms 25280KB
24 AC 100% 154ms 59648KB
25 AC 100% 104ms 49920KB
26 AC 100% 107ms 49712KB
27 AC 100% 26ms 17200KB
28 AC 100% 22ms 14048KB
29 AC 100% 60ms 30720KB
30 AC 100% 59ms 34496KB
31 AC 100% 129ms 58224KB
32 AC 100% 45ms 31328KB
33 AC 100% 13ms 11792KB
34 AC 100% 85ms 43168KB
35 AC 100% 14ms 10656KB
36 AC 100% 88ms 40304KB
37 AC 100% 40ms 23056KB
38 AC 100% 9ms 8416KB
39 AC 100% 132ms 56160KB
40 AC 100% 13ms 12736KB
41 AC 100% 109ms 48320KB
42 AC 100% 30ms 18288KB
43 AC 100% 103ms 57712KB
44 AC 100% 60ms 31456KB
45 AC 100% 91ms 41648KB
46 AC 100% 69ms 36432KB
47 AC 100% 106ms 46688KB
48 AC 100% 107ms 50208KB
49 AC 100% 41ms 28192KB
50 AC 100% 97ms 45360KB
51 AC 100% 20ms 13120KB
52 AC 100% 52ms 26896KB
53 AC 100% 35ms 21632KB
54 AC 100% 50ms 34880KB
55 AC 100% 22ms 15664KB
56 AC 100% 70ms 34160KB
57 AC 100% 33ms 28480KB
58 AC 100% 41ms 26912KB
59 AC 100% 35ms 24960KB
60 AC 100% 30ms 18304KB
61 AC 100% 43ms 25072KB
62 AC 100% 77ms 42080KB
63 AC 100% 91ms 43120KB
64 AC 100% 102ms 48768KB
65 AC 100% 73ms 42368KB
66 AC 100% 3ms 7632KB
67 AC 100% 71ms 38592KB
68 AC 100% 68ms 34496KB
69 AC 100% 136ms 68512KB
70 AC 100% 52ms 32448KB

ソースコード

#include<stdio.h>
long long R=1,C=1,H[2000010],N[2000010];
long long MAX(long long a,long long b){return a<b?b:a;}
//評価関数(いまはMIN)
int hyouka(int a,int b){
  if(C<b)return 1;
  if(C<a||b==0)return 0;
  return N[H[a]]<N[H[b]]?1:0;
}
//挿入関数
void hin(long long a){
  int i=C++;
  for(N[H[0]=R]=a;hyouka(0,i/2);i/=2)H[i]=H[i/2];
  H[i]=R++;
}
//取り出す関数
int hout(){
  int rt=H[1],i,j=2,k=H[--C];
  for(i=1;hyouka(i,C);i=j)H[i]=H[j=i*2+1-hyouka(i*2,i*2+1)];
  H[j/2]=k;
  return rt;
}
long long CO[100010];
long long i,id[600010],ta[600010],nt[600010],f[600010]={0};
void dijk(int v,int e,int *fr,int *to,int *co,int mi){
  for(i=0;i<v;i++)ta[i]=-1;
  for(i=0;i<v;i++)CO[i]=1e17;
  for(i=CO[mi]=0;i<e;i++){
    nt[i]=ta[fr[i]];
    ta[fr[i]]=i;
  }
  while(f[mi]-1){
    f[mi]=1;
    for(i=ta[mi];i+1;i=nt[i]){
      if(CO[to[i]]>CO[mi]+co[i])hin(CO[id[R]=to[i]]=CO[mi]+co[i]);
    }
    while(f[mi]&&C-1)mi=id[hout()];
  }
}
int main(){
  int n,m,k,i,a[600010],b[600010],c[600010],e[100010],f[100010],max=0;
  scanf("%d %d %d",&n,&m,&k);
  for(i=0;i<m;i++)scanf("%d %d %d",&a[i],&b[i],&c[i]);
  for(i=0;i<k;i++){
    scanf("%d %d",&e[i],&f[i]);
    max=MAX(max,f[i]);
  }
  for(i=0;i<k;i++){
    a[i+m]=0;
    b[i+m]=e[i];
    c[i+m]=max-f[i];
  }
  for(i=0;i<m+k;i++){
    a[i+m+k]=b[i];
    b[i+m+k]=a[i];
    c[i+m+k]=c[i];
  }
  dijk(n+1,m+k+m+k,a,b,c,0);
  for(i=k=0;i<n;i++){
    if(CO[i+1]<=max)k++;
  }
  printf("%d\n",k);
  return 0;
}