次短路求法
思路很简单,用一个数组dist[i][2]表示从1到 i 的最短和次短路,如果通过某一个点能更新最短路,就更新最短路,最短路既然被更新的说明已经不是最短路了,就把它放到次短路的位置,如果最短路不能别更新,说明它不是最短路,就考虑是不是次短路,如果能更新次短路就更新最短路说明它就是次短路。
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
using namespace std;
const int maxn = 100;
int dist[maxn][2];
int n;
int g[100][100];
bool v[100];
int main()
{
memset(g, 0x3f, sizeof g);
g[1][2] = g[2][1] = 1;
g[1][5] = g[5][1] = 4;
g[1][3] = g[3][1] = 2;
g[3][5] = g[5][3] = 3;
g[3][4] = g[4][3] = 1;
g[2][4] = g[4][2] = 7;
g[2][5] = g[5][2] = 4;
memset(dist, 0x3f, sizeof dist);
memset(v, false, sizeof v);
dist[1][0] = 0;
for (int i = 1; i <= 5; i++){
dist[i][0] = g[1][i];
}
v[1] = true;
while (1){
int ind = -1;
int mn = 0x3f3f3f3f;
for (int i = 1; i <= 5; i++){
if(v[i] == false && dist[i][0] < mn){
mn = dist[i][0];
ind = i;
}
}
if(ind == -1){
break;
}
v[ind] = true;
for (int i = 1; i <= 5; i++){
if(dist[i][0] > dist[ind][0] + g[ind][i]){
dist[i][1] = dist[i][0];
dist[i][0] = dist[ind][0] + g[ind][i];
}
else{
dist[i][1] = min(dist[i][1], dist[ind][0] + g[ind][i]);
}
}
}
printf("%d--------------%d\n", dist[5][0], dist[5][1]);
return 0;
}
本文来自博客园,作者:correct,转载请注明原文链接:https://www.cnblogs.com/correct/p/12862054.html

浙公网安备 33010602011771号