zoukankan      html  css  js  c++  java
  • Codeforces 450D Jzzhu and Cities [heap优化dij]

    #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;
    }
  • 相关阅读:
    团队作业(三)
    第四章学习笔记
    2.3.1测试
    缓冲区溢出漏洞实验
    第三章学习笔记
    团队作业(二)
    第十一章学习笔记
    第7,8章自学笔记
    stat命令实现—mystat
    第五章学习笔记
  • 原文地址:https://www.cnblogs.com/tun117/p/5475802.html
Copyright © 2011-2022 走看看