导航

Codeforces 450D Jzzhu and Cities [heap优化dij]

Posted on 2016-05-09 22:52  tun~  阅读(183)  评论(0编辑  收藏  举报
#include<bits/stdc++.h>
#define MAXN 100050
#define MAXM 900000
using namespace std;
struct st
{
    int id;
    long long dis;
    st(int a,long long b)
    {
        id=a;
        dis=b;
    }
    st(){};
};
struct edge{
    bool im;
    int id;
    long long w;
    edge *next;
};
edge *adj[MAXN];
edge edges[MAXM];
int ednum;
inline void add_edge(int a,int b,long long w,bool im){
    edge *tmp=&edges[ednum++];
    tmp->id=b;
    tmp->w=w;
    tmp->im=im;
    tmp->next=adj[a];
    adj[a]=tmp;
}
bool operator < (const st &a,const st &b){
    return a.dis>b.dis;
}
long long dis[MAXN];
bool used[MAXN];
void dfss(int num)
{
    for(int i=1;i<=MAXN;i++){
        dis[i]=999999999999999;
    }
    priority_queue<st>q;
    st tmp;
    dis[1]=0;
    q.push(st(1,0));
    while(!q.empty())
    {
        tmp=q.top();
        q.pop();
        if(dis[tmp.id]<tmp.dis)continue;
        for(edge *p=adj[tmp.id];p;p=p->next)
        {
            if(dis[p->id]==p->w+dis[tmp.id]){
                if(p->im==0)used[p->id]=0;
            }
            if(dis[p->id]>p->w+dis[tmp.id])
            {
                if(p->im)used[p->id]=1;
                else used[p->id]=0;
               dis[p->id]=p->w+dis[tmp.id];
               q.push(st(p->id,dis[p->id]));
            }
        }
    }
}
int main()
{
    int n,m,k;
    scanf("%d%d%d",&n,&m,&k);
    for(int i=1;i<=m;i++){
        int u,v;
        long long w;
        scanf("%d%d%I64d",&u,&v,&w);
        add_edge(u,v,w,0);
        add_edge(v,u,w,0);
    }
    for(int i=1;i<=k;i++){
        int v;
        long long w;
        scanf("%d%I64d",&v,&w);
        add_edge(1,v,w,1);
        add_edge(v,1,w,1);
    }
    dfss(1);
    int ans=0;
    for(int i=1;i<=n;i++){
        ans+=used[i];
    }
    cout << k-ans << endl;
}