一个裸的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;
}