题目:http://codeforces.com/problemset/problem/450/D
题意:一个国家的总统,想要建更更少的铁路,普通城市之间建的是公路,普通城市和首都之间是铁路。给你公路连接关系和铁路连接关系,保证各个城市到首都最短路不变的情况下,求可以删掉的铁路数?
分析:果断dijkstra
#include <bits/stdc++.h>
#define FI(ii,aa,bb) for(ll ii=aa;ii<=bb;ii++)
#define F(ii,aa,bb) for(ll ii=aa;ii<bb;ii++)
#define TF(ii,aa,bb) for(ll ii=aa;ii>=bb;ii--)
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
int ans,n,m,k,T[100005],H[100005],dis[100005];
bool tra[100005];
vector<pair<int,int> > V[100005];
void ShortestPath(){
int sz,cost,node,to,edge;
priority_queue<pair<int,int>> Q;
FI(i,2,n){
dis[i]=T[i];
tra[i]=H[i];
if(tra[i]) Q.push(make_pair(-dis[i],i));
}
Q.push(make_pair(0,1));
while(!Q.empty()){
cost=-Q.top().first;
node=Q.top().second;
Q.pop();
if(cost>dis[node]) continue;
sz=V[node].size();
F(i,0,sz){
to=V[node][i].first;
edge=V[node][i].second+cost;
if(dis[to]>edge || (dis[to]==edge && tra[to])){
if(tra[to]) ans++,tra[to]=false;
dis[to]=edge;
Q.push(make_pair(-dis[to],to));
}
}
}
}
int main()
{
int x,y,w;
scanf("%d %d %d",&n,&m,&k);
FI(i,1,n) T[i]=inf;
FI(i,1,m){
scanf("%d %d %d",&x,&y,&w);
V[x].push_back(make_pair(y,w));
V[y].push_back(make_pair(x,w));
}
FI(i,1,k){
scanf("%d %d",&x,&w);
T[x]=min(T[x],w);
H[x]++;
if(H[x]>1) ans++;
}
ShortestPath();
cout << ans << endl;
return 0;
}