请柬

题面

一个裸的digstra

#include<stdio.h>
#include<queue>
using namespace std;
struct data
{
    int v;int next;int val;
}edge[1000010];int cnt;
int alist[1000010];
void add(int u,int v,int val)
{
    edge[++cnt].v=v;
    edge[cnt].val=val;
    edge[cnt].next=alist[u];
    alist[u]=cnt;
    return;
}
struct data2
{
    int v;int next;int val;
}edge2[1000010];int cnt2;
int alist2[1000010];
void kid(int v,int u,int val)
{
    edge2[++cnt2].v=v;
    edge2[cnt2].val=val;
    edge2[cnt2].next=alist2[u];
    alist2[u]=cnt2;
    return;
}
struct node
{
    int d;int n;
    friend bool operator <(node a,node b)
    {
        return a.d>b.d;
    }
}d[1000010],now;
priority_queue <node> pq;
bool book[1000010];
int n;int m;
long long res;
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=0;i<m;i++)
    {
        int u;int v;int val;
        scanf("%d%d%d",&u,&v,&val);
        add(u,v,val);
        kid(u,v,val);
    }
    for(int i=1;i<=n;i++)//初始化
    {
        d[i].d=0x3f3f3f3f;
        d[i].n=i;
    }
    d[1].d=0;pq.push(d[1]);
    while(!pq.empty())
    {
        now=pq.top();pq.pop();
        //printf("now %d\n",now.n);
        book[now.n]=true;
        int next=alist[now.n];
        while(next)
        {
            int v=edge[next].v;
            int val=edge[next].val;
            if(book[v]==false)
            {
                if(d[v].d>now.d+val)
                {
                    d[v].d=now.d+val;
                    pq.push(d[v]);
                    //printf("->d[%d]=%d\n",v,d[v].d);
                }
            }
            next=edge[next].next;
        }
    }
    for(int i=1;i<=n;i++)
    {
        res+=d[i].d;
    }
    for(int i=1;i<=n;i++)
    {
        d[i].d=0x3f3f3f3f;
        d[i].n=i;
    }
    d[1].d=0;pq.push(d[1]);
    while(!pq.empty())
    {
        now=pq.top();pq.pop();
        //printf("now %d\n",now.n);
        book[now.n]=false;
        int next=alist2[now.n];
        while(next)
        {
            int v=edge2[next].v;
            int val=edge2[next].val;
            if(book[v]==true)
            {
                if(d[v].d>now.d+val)
                {
                    d[v].d=now.d+val;
                    pq.push(d[v]);
                    //printf("->d[%d]=%d\n",v,d[v].d);
                }
            }
            next=edge2[next].next;
        }
    }
    for(int i=1;i<=n;i++)
    {
        res+=d[i].d;
    }
    printf("%lld",res);
    return 0;
}

  

posted @ 2019-07-15 13:45  [jackeylove]  阅读(103)  评论(0编辑  收藏  举报