POJ 1502 MPI Maelstrom 单源最短路Dijkstra

题意:有n个点,然后有一个矩阵为左下矩阵,A[i, j] = A[j, i] = k表示i到j的距离是k,路径是双向的。然后输出从点1出发达到所有顶点的最短路长度中最大的那个。

想法:单源最短路,加上图中直接给出了矩阵,中规中矩的Dijkstra模板,主要是在证明算法正确性之后,很好的去理解算法的过程,和具体步骤的含义。用到一个atoi函数,表示将ACSII转化为int,用到的头文件#include<algorithm> using namespace std;

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int inf = 100000;
int map[111][111];
int n;
int dis[111];

void Dijkstra(int source)
{
	bool visit[111];
	memset(visit, false, sizeof(visit));
	for(int i = 1; i <= n; ++i){
		dis[i] = map[source][i];
	}
	dis[source] = 0;
	visit[source] = true;
	for(int k = 1; k <= n - 1; ++k){
		int pick_min = inf;
		int pos;
		for(int i = 1; i <= n; ++i){
			if(!visit[i] && pick_min > dis[i]){
				pick_min = dis[i];
				pos = i;
			}
		}
		
		visit[pos] = true;
		
		for(int i = 1; i <= n; ++i){
			if(!visit[i] && dis[i] > dis[pos] + map[pos][i]){
				dis[i] = dis[pos] + map[pos][i];
			}
		}
	}
}

int main()
{
	while(~scanf("%d", &n))
	{
		memset(map, 0, sizeof(map));
		
		for(int i = 1; i <= n; ++i){
			for(int j = 1; j < i; ++j){
				char in_char[5];
				scanf("%s", in_char);
				if(in_char[0] != 'x'){
					map[i][j] =map[j][i] = atoi(in_char);
				}
				else map[i][j] = map[j][i] = inf;
			}
		}	
		
		Dijkstra(1);
		
		int max_ans = -1;
		for(int i = 2; i <= n; ++i){
			if(max_ans < dis[i]){
				max_ans = dis[i];
			}
		}
		
		printf("%d\n", max_ans);
	}
	return 0;
}




猜你喜欢

转载自blog.csdn.net/triple_wdf/article/details/80543008