堆优化dijkstra,假设哪条铁路能够被更新,就把相应铁路删除。

B. Jzzhu and Cities
time limit per test

2 seconds

memory limit per test

256 megabytes

input

standard input

output

standard output

Jzzhu is the president of country A. There are n cities numbered from 1 to n in
his country. City 1 is the capital of A. Also there are mroads
connecting the cities. One can go from city ui to vi (and
vise versa) using the i-th road, the length of this road is xi.
Finally, there are k train routes in the country. One can use the i-th
train route to go from capital of the country to city si (and
vise versa), the length of this route is yi.

Jzzhu doesn't want to waste the money of the country, so he is going to close some of the train routes. Please tell Jzzhu the maximum number of the train routes which can be closed under the following condition: the length of the shortest path from every city
to the capital mustn't change.

Input

The first line contains three integers n, m, k (2 ≤ n ≤ 105; 1 ≤ m ≤ 3·105; 1 ≤ k ≤ 105).

Each of the next m lines contains three integers ui, vi, xi (1 ≤ ui, vi ≤ nui ≠ vi; 1 ≤ xi ≤ 109).

Each of the next k lines contains two integers si and yi (2 ≤ si ≤ n; 1 ≤ yi ≤ 109).

It is guaranteed that there is at least one way from every city to the capital. Note, that there can be multiple roads between two cities. Also, there can be multiple routes going to the same city from the capital.

Output

Output a single integer representing the maximum number of the train routes which can be closed.

Sample test(s)
input
5 5 3
1 2 1
2 3 2
1 3 3
3 4 4
1 5 5
3 5
4 5
5 5
output
2
input
2 2 3
1 2 2
2 1 3
2 1
2 2
2 3
output
2

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <vector> using namespace std; typedef long long int LL;
typedef pair<LL,int> pLI;
typedef pair<int,LL> pIL; const int maxn=210000;
const LL INF=1LL<<60; int n,m,k;
vector<pIL> edge[maxn]; LL dist[maxn];
bool train[maxn]; int main()
{
scanf("%d%d%d",&n,&m,&k);
for(int i=0;i<m;i++)
{
int u,v;LL x;
//scanf("%d%d%lld",&u,&v,&x);
scanf("%d%d%I64d",&u,&v,&x);
u--; v--;
edge[u].push_back(make_pair(v,x));
edge[v].push_back(make_pair(u,x));
}
for(int i=0;i<=n;i++)
{
dist[i]=INF;
train[i]=false;
}
dist[0]=0;
for(int i=0;i<k;i++)
{
int s; LL y;
//scanf("%d%lld",&s,&y);
scanf("%d%I64d",&s,&y);
s--;
train[s]=true;
dist[s]=min(dist[s],y);
}
priority_queue<pLI> heap;
for(int i=0;i<n;i++)
{
if(dist[i]!=INF)
{
heap.push(make_pair(-dist[i],i));
}
}
while(heap.size())
{
pLI temp=heap.top(); heap.pop();
LL D=-temp.first;
int u=temp.second;
if(dist[u]!=D) continue;
for(int i=0,sz=edge[u].size();i<sz;i++)
{
int v=edge[u][i].first;
LL len=edge[u][i].second;
if(dist[v]>=dist[u]+len)
{
if(train[v]==true)
{
train[v]=false;
}
}
if(dist[v]>dist[u]+len)
{
dist[v]=dist[u]+len;
heap.push(make_pair(-dist[v],v));
}
}
}
int ans=k;
for(int i=0;i<n;i++)
{
ans-=train[i];
}
printf("%d\n",ans);
return 0;
}

最新文章

  1. Android开发-动态布局小记
  2. 全面的Seo面试题
  3. GNU CMAKE 笔记
  4. 20个命令行工具监控Linux系统性能
  5. .NET Expression Tree
  6. Quartz 2d绘图
  7. js面向对象(构造函数与继承)
  8. Hibernate逍遥游记-第12章 映射值类型集合-004映射Map(&lt;map-key&gt;)
  9. DNS主配置文件的几个选项
  10. jQuery Lazy Load 图片延迟加载
  11. 批量修改文件名java
  12. 使用ssh无密码登录
  13. Winform DataGridView CheckBoxColumn c# 单选 解决方案
  14. spring jdbc 源码
  15. ubuntu下发布asp.net core并用nginx代理之旅(续)
  16. Java 架构师眼中的 HTTP 协议
  17. Kafka 0.11.0.0 实现 producer的Exactly-once 语义(中文)
  18. Poi 生成xls
  19. .net Kafka.Client多个Consumer Group对Topic消费不能完全覆盖研究总结(二)
  20. 卷积神经网络(CNN)代码实现(MNIST)解析

热门文章

  1. Android之RecyclerView简单使用(三)
  2. 关于Android中设置闹钟的相对完善的解决方案
  3. S​D​I​与​A​S​I 接口具体解释介绍
  4. [AngularJS] Write a simple Redux store in AngularJS app
  5. php.ini 修改上传文件的限制
  6. spring-如何在项目启动的情况下获取Bean实例
  7. 转载:使用bat命令来快速安装和卸载Service服务
  8. 【编程】常见概念的理解 —— inplace、vanity url、vanilla(code/software)、编译、链接、build、(delegate、proxy)
  9. yield return
  10. 远程登录DSM,显示“您没有权限使用本项服务?