普通方法
const int INF = 10000;
const int MAX_V = 100;
int cost[MAX_V][MAX_V]; // 花费
int d[MAX_V]; // 起始顶点到所有顶点最短距离
bool S[MAX_V]; // 是否在集合中
int V = 7; // 顶点数
// 传入的是起始顶点
void dijkstra(int s){
fill(d, d + V, INF);
fill(S, S + V, false);
d[s] = 0;
while(true){
int v = -1;
for(int u = 0; u < V; u++){
if(!S[u] && (v == -1 || d[u] < d[v])){
v = u;
}
}
if(v == -1)
break;
S[v] = true;
for(int u = 0; u < V; u++){
d[u] = min(d[u], d[v] + cost[v][u]);
}
}
}
复杂度低
typedef pair<int, int> pii;
int n, m; // 顶点数和边数
int first[100];
int u[100], v[100], w[100], _next[100];
int d[100];
int fa[100];
void read(){
cin >> n >> m;
for(int i = 0; i < n; i++)
first[i] = -1;
for(int e = 0; e < m; e++){
cin >> u[e] >> v[e] >> w[e];
_next[e] = first[u[e]];
first[u[e]] = e;
}
}
void dijkstra(){
for(int i = 0; i < n; i++){
d[i] = INF;
}
d[0] = 0; // 0为起点
priority_queue<pii, vector<pii>, greater<pii> > pq;
pq.push(make_pair(0, 0));
while(!pq.empty()){
pii pr = pq.top();
pq.pop();
int min_idx = pr.second;
if(pr.first != d[min_idx])
continue;
for(int e = first[min_idx]; e != -1; e = _next[e]){
if(d[u[e]] + w[e] < d[v[e]]){
d[v[e]] = d[u[e]] + w[e];
fa[v[e]] = u[e];
pq.push(make_pair(d[v[e]], v[e]));
}
}
}
}