poj1502 MPI Maelstrom 最短路径,dijkstra

3 篇文章 0 订阅
2 篇文章 0 订阅

题目链接:http://poj.org/problem?id=1502

题目大意:N个处理器要进行信息传递,处理器i传递信息给自己不需要时间,处理器i与处理器j之间相互传递信息的时间是一样的,不同处理器之间传递信息所需要的时间由一个矩阵的下三角给出。若矩阵对应位置为x,则说明相应的两个处理器之间无法传递信息。求从第一个处理器传递信息到其他所有处理器最少需要多少时间。

思路:赤裸裸的迪杰斯特拉

想做做迪杰斯特拉的题,先看了看dijkstra算法发现发现迪杰斯特拉的算法中完全可以不使用优先队列存储已经求得最短路径的点。使用数组 dist[ i ] 存储源点到 i 点的最短路径,初始时将 dist[ ]  每个元素初始化最大整数。起始将源点 s 压入队列中,dist[ s ] 设为0。 只要每次将更新了最短路径的点压入一个队列中,每次从队列头取出一个点 u ,检索以这个点为起点的边 e(u,v)  ,如果发现 通过 e 可以得到更短的路径到达 v 点,就更新dist[v],同时将  v  点压入队列中。直至队列为空,算法完成,dist[ i ] 中就存储了源点到 i 点的最短距离。按照自己这种思路写完代码,直接通过样例,提交也直接AC   ^_^

///2014.7.14
///poj1502

//Accepted	732K	16MS	G++	1254B	2014-07-14 12:39:22

//最短路径,不使用优先队列的dijkstra

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <cmath>
using namespace std;
const int MAXINT = pow(2,sizeof(int)*8-1)-1;

int n;
int edge[110][110];
int dist[110];

void init(){
	scanf("%d",&n);
	for(int i=0 ; i<n ; i++)
		dist[i] = MAXINT;
	dist[0] = 0;
	for(int i=0 ; i<n ; i++){
		for(int j=0 ; j<n ; j++){
			if( i==j )
				edge[i][j] = 0;
			else if( i>j ){
				char buf[15];
				scanf("%s",buf);
				if( buf[0]=='x' )
					edge[i][j] = edge[j][i] = -1;
				else{
					sscanf(buf,"%d",&edge[i][j]);
					edge[j][i] = edge[i][j];
				}
			}
		}
	}
}
void dijkstra(){
	queue<int> que;
	dist[0] = 0;
	que.push(0);
	while( !que.empty() ){
		int p = que.front();
		que.pop();
		for(int i=0 ; i<n ; i++){
			if( edge[p][i] != -1 ){
				if( dist[p]+edge[p][i] < dist[i] ){
					que.push(i);
					dist[i] = dist[p]+edge[p][i];
				}
			}
		}
	}
}
int findmax(){
    int x = 0;
    for(int i=0 ; i<n ; i++)
        if( dist[i]>x )
            x = dist[i];
    return x;
}

int main(){
//	freopen("in","r",stdin);
//	freopen("out","w",stdout);

	init();
	dijkstra();
	cout<<findmax()<<endl;
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值