功能数组
const int MAXN = 1000;
const int INF = 0x3fffffff;
int G[MAXN][MAXN], cost[MAXN][MAXN],weight[MAXN];
bool visited[MAXN];
int dist[MAXN], pre[MAXN],c[MAXN],wg[MAXN],num[MAXN];
vector<int> G1[MAXN];
int n, m, u, v, w;
//最短距离加最短路径(只求最短距离和最短路径)核心部分的注释就只出现在这个程序中啦,下面的代码中注释就不会有这么多了,因为大部分都差不多。
void Dijkstra(int start) {
fill(visited, visited + n, false);
fill(dist, dist + n, INF);
for (int i = 0; i < n; i++) pre[i] = i;
dist[start] = 0;
for (int i = 0; i < n; i++) {
int minw = INF, index = -1;
for (int j = 0; j < n; j++) {
if (visited[j] == false && minw > dist[j]) {
minw = dist[j];
index = j;
}
}
if (index == -1) return;
visited[index] = true;
for (int v = 0; v < n; v++) {
if (visited[v] == false && dist[v] > dist[index] + G[index][v]) {
dist[v] = dist[index] + G[index][v];
pre[v] = index;
}
}
}
}
//最短距离加最短路径(附加边权值)同等距离下边权值越小越好
void Dijkstra_Add_EdgeCost(int start) {
fill(visited, visited + n, false);
fill(dist, dist + n, INF);
fill(c, c + MAXN, INF);
for (int i = 0; i < n; i++) pre[i] = i;
dist[start] = 0; c[start] = 0;
for (int i = 0; i < n; i++) {
int minw = INF, index = -1;
for (int j = 0; j < n; j++) {
if (visited[j] == false && minw > dist[j]) {
minw = dist[j];
index = j;
}
}
if (index == -1) return;
visited[index] = true;
for (int v = 0; v < n; v++) {
if (visited[v] == false) {
if (dist[v] > dist[index] + G[index][v]) {
dist[v] = dist[index] + G[index][v];
c[v] = c[index] + cost[index][v];
pre[v] = index;
}
else if (dist[v] == dist[index] + G[index][v] && c[v] > c[index] + cost[index][v]) {
c[v] = c[index] + cost[index][v];
pre[v] = index;
}
}
}
}
}
//最短距离加最短路径(附加点权值)同等距离下点权值越大越好
void Dijkstra_Add_VertexCost(int start) {
fill(visited, visited + n, false);
fill(dist, dist + n, INF);
fill(wg, wg + MAXN, 0);
for (int i = 0; i < n; i++) pre[i] = i;
dist[start] = 0; c[start] = 0;
for (int i = 0; i < n; i++) {
int minw = INF, index = -1;
for (int j = 0; j < n; j++) {
if (visited[j] == false && minw > dist[j]) {
minw = dist[j];
index = j;
}
}
if (index == -1) return;
visited[index] = true;
for (int v = 0; v < n; v++) {
if (visited[v] == false) {
if (dist[v] > dist[index] + G[index][v]) {
dist[v] = dist[index] + G[index][v];
wg[v] = wg[index] + weight[v];
pre[v] = index;
}
else if (dist[v] == dist[index] + G[index][v] && wg[v] < wg[index] + weight[v]) {
wg[v] = wg[index] + weight[v];
pre[v] = index;
}
}
}
}
}
//记录最短路径的条数
void Dijkstra_Add_PathCnt(int start) {
fill(visited, visited + n, false);
fill(dist, dist + n, INF);
fill(num, num + n, 0);
num[start] = 1;
for (int i = 0; i < n; i++) pre[i] = i;
dist[start] = 0; c[start] = 0;
for (int i = 0; i < n; i++) {
int minw = INF, index = -1;
for (int j = 0; j < n; j++) {
if (visited[j] == false && minw > dist[j]) {
minw = dist[j];
index = j;
}
}
if (index == -1) return;
visited[index] = true;
for (int v = 0; v < n; v++) {
if (visited[v] == false) {
if (dist[v] > dist[index] + G[index][v]) {
dist[v] = dist[index] + G[index][v];
num[v] = num[index];
pre[v] = index;
}
else if (dist[v] == dist[index] + G[index][v]) {
num[v] += num[index];
}
}
}
}
}
查找路径
void findPath(int start,int v) {
if (start == v) {
cout << v << " ";
return;
}
findPath(start, pre[v]);
cout << v << " ";
}
完整测试代码:
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1000;
const int INF = 0x3fffffff;
int G[MAXN][MAXN], cost[MAXN][MAXN],weight[MAXN];
bool visited[MAXN];
int dist[MAXN], pre[MAXN],c[MAXN],wg[MAXN],num[MAXN];
vector<int> G1[MAXN];
int n, m, u, v, w;
void Dijkstra(int start) {
fill(visited, visited + n, false);
fill(dist, dist + n, INF);
for (int i = 0; i < n; i++) pre[i] = i;
dist[start] = 0;
for (int i = 0; i < n; i++) {
int minw = INF, index = -1;
for (int j = 0; j < n; j++) {
if (visited[j] == false && minw > dist[j]) {
minw = dist[j];
index = j;
}
}
if (index == -1) return;
visited[index] = true;
for (int v = 0; v < n; v++) {
if (visited[v] == false && dist[v] > dist[index] + G[index][v]) {
dist[v] = dist[index] + G[index][v];
pre[v] = index;
}
}
}
}
void Dijkstra_Add_EdgeCost(int start) {
fill(visited, visited + n, false);
fill(dist, dist + n, INF);
fill(c, c + MAXN, INF);
for (int i = 0; i < n; i++) pre[i] = i;
dist[start] = 0; c[start] = 0;
for (int i = 0; i < n; i++) {
int minw = INF, index = -1;
for (int j = 0; j < n; j++) {
if (visited[j] == false && minw > dist[j]) {
minw = dist[j];
index = j;
}
}
if (index == -1) return;
visited[index] = true;
for (int v = 0; v < n; v++) {
if (visited[v] == false) {
if (dist[v] > dist[index] + G[index][v]) {
dist[v] = dist[index] + G[index][v];
c[v] = c[index] + cost[index][v];
pre[v] = index;
}
else if (dist[v] == dist[index] + G[index][v] && c[v] > c[index] + cost[index][v]) {
c[v] = c[index] + cost[index][v];
pre[v] = index;
}
}
}
}
}
void Dijkstra_Add_VertexCost(int start) {
fill(visited, visited + n, false);
fill(dist, dist + n, INF);
fill(wg, wg + MAXN, 0);
for (int i = 0; i < n; i++) pre[i] = i;
dist[start] = 0; c[start] = 0;
for (int i = 0; i < n; i++) {
int minw = INF, index = -1;
for (int j = 0; j < n; j++) {
if (visited[j] == false && minw > dist[j]) {
minw = dist[j];
index = j;
}
}
if (index == -1) return;
visited[index] = true;
for (int v = 0; v < n; v++) {
if (visited[v] == false) {
if (dist[v] > dist[index] + G[index][v]) {
dist[v] = dist[index] + G[index][v];
wg[v] = wg[index] + weight[v];
pre[v] = index;
}
else if (dist[v] == dist[index] + G[index][v] && wg[v] < wg[index] + weight[v]) {
wg[v] = wg[index] + weight[v];
pre[v] = index;
}
}
}
}
}
void Dijkstra_Add_PathCnt(int start) {
fill(visited, visited + n, false);
fill(dist, dist + n, INF);
fill(num, num + n, 0);
num[start] = 1;
for (int i = 0; i < n; i++) pre[i] = i;
dist[start] = 0; c[start] = 0;
for (int i = 0; i < n; i++) {
int minw = INF, index = -1;
for (int j = 0; j < n; j++) {
if (visited[j] == false && minw > dist[j]) {
minw = dist[j];
index = j;
}
}
if (index == -1) return;
visited[index] = true;
for (int v = 0; v < n; v++) {
if (visited[v] == false) {
if (dist[v] > dist[index] + G[index][v]) {
dist[v] = dist[index] + G[index][v];
num[v] = num[index];
pre[v] = index;
}
else if (dist[v] == dist[index] + G[index][v]) {
num[v] += num[index];
}
}
}
}
}
void findPath(int start,int v) {
if (start == v) {
cout << v << " ";
return;
}
findPath(start, pre[v]);
cout << v << " ";
}
void input() {
fill(G[0], G[0] + MAXN * MAXN, INF);
scanf("%d %d", &n, &m);
for (int i = 0; i < m; i++) {
scanf("%d %d %d", &u, &v, &w);
G[u][v] = w;
}
for (int i = 0; i < m; i++) {
scanf("%d %d %d", &u, &v, &w);
cost[u][v] = w;
}
for (int i = 0; i < n; i++) {
scanf("%d", &weight[i]);
}
}
int main() {
freopen("Text.txt", "r", stdin);
input();
Dijkstra_Add_PathCnt(0);
for (int i = 0; i < n; i++) cout << dist[i] << " ";
cout << endl;
for (int i = 0; i < n; i++) cout << num[i] << " ";
cout << endl;
findPath(0, 3);
}