次短路求法

思路很简单,用一个数组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;
}

 

posted @ 2019-08-21 23:11  correct  阅读(205)  评论(0)    收藏  举报