特殊Dijkstra求单源最短路径.
#include <iostream>
#include <cstdio>
#include <queue>
#include <vector>
#include <cstring>
using namespace std;
const int MAXN = 10005;
const int INF = 0x3fffff;
struct qnode{
int v, c;
qnode(int _v = 0, int _c = 0):v(_v), c(_c){}
bool operator < (const qnode &r) const{
return c > r.c;
}
};
struct Edge{
int v, cost;
Edge(int _v = 0, int _cost = 0): v(_v), cost(_cost){}
};
vector<Edge> E[MAXN];
bool visit[MAXN];
int dist[MAXN]; //最短路
int COST[MAXN]; //存储单源结果
void Dijkstra(int start, int n)
{
memset(visit, 0, sizeof(visit));
for(int i = 1; i <= n; ++i)
{
dist[i] = INF;
COST[i] = INF;
}
priority_queue<qnode> que;
while(!que.empty()) que.pop();
COST[start] = 0;
dist[start] = 0;
que.push(qnode(start, 0));
qnode tmp;
while(!que.empty())
{
tmp = que.top();
que.pop();
int u = tmp.v;
if(visit[u]) continue;
visit[u] = true;
for(int i = 0; i < E[u].size(); ++i)
{
int v = E[u][i].v;
int cost = E[u][i].cost;
if(!visit[v])
{
if(dist[v] > cost + dist[u]) //松弛操作
{
COST[v] = cost;
dist[v] = dist[u] + cost;
que.push(qnode(v, dist[v]));
}else if(dist[v] == cost + dist[u])
COST[v] = min(COST[v], cost);
}
}
}
}
void addEdge(int u, int v, int w) //无向图******
{
E[u].push_back(Edge(v, w));
E[v].push_back(Edge(u, w));
}
int main()
{
int n, m;
while(scanf("%d%d", &n, &m) != EOF)
{
int u, v, w;
while(m--)
{
scanf("%d%d%d", &u, &v, &w);
addEdge(u, v, w);
}
Dijkstra(1, n);
int ans = 0;
for(int i = 2; i <= n; ++i)
ans += COST[i];
printf("%d\n", ans);
}
}