//
// main.cpp
// demo
//
// Created by King_Jane on 2017/3/13.
// Copyright © 2017年 King_Jane. All rights reserved.
//
#include<cstdio>
#include<queue>
#include<vector>
#define MAXN 100005
#define INF 0x7fffffff
int n,m;
using namespace std;
struct Point
{
int u;
int dist;
Point(int uu,int d){
u=uu,dist=d;
}
//优先队列 ,按dist从小到大
bool operator < (const Point &a) const {
return dist > a.dist;
}
};
struct Edge
{
int v;
int cost;
Edge(int vv,int c){
v=vv,cost=c;
}
};
vector<Edge> G[MAXN];
bool vis[MAXN];
int disto[MAXN];
int costo[MAXN];
void Dijkstra(int s)
{
//源是1
for(int i=1;i<=n;i++){
// 初始化 都没访问,dist都是最大
vis[i]=false;
disto[i]=costo[i]=INF;
}
disto[s]=0;
costo[s]=0;
priority_queue<Point> queue;
queue.push(Point(s,0));
while(!queue.empty()){
Point p=queue.top();//选择dist最小的点
queue.pop();
int u=p.u;
if(!vis[u]){ //没有在集合S中
for(int i=0;i<G[u].size();i++){//遍历u相邻的点
int v=G[u][i].v;
int co=G[u][i].cost;
if(!vis[v]){ //没有在S中
if(disto[v]>disto[u]+co){
disto[v]=disto[u]+co;//更新dist
queue.push(Point(v,disto[v]));
costo[v]=co;
}
if(disto[v]==disto[u]+co){
costo[v]=min(costo[v],co);//贪心,相同,选择这一段最小的
}
}
}
}
vis[u]=true;
}
}
int main()
{
int u,v,c;
scanf("%d%d",&n,&m);
while(m--){
//邻接表 存储图
scanf("%d%d%d",&u,&v,&c);
G[u].push_back(Edge(v,c));
G[v].push_back(Edge(u,c));
}
Dijkstra(1);
int ans=0;
for(int i=2;i<=n;i++)
ans+=costo[i];
printf("%d",ans);
}
解题方法:Dijkstra+优先队列