题目链接: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;
}