您的位置:首页 > 其它

poj_1502_MPI Maelstrom(Dijkstra求单源最短路径)

2013-10-31 19:51 344 查看
题型:图论

题意

话说这个题还真心难读(或许是个人英语水平过次o_O),给出n个处理器,处理器之间可以相互联系,可以看作一个无向图,输入部分为邻接矩阵下三角,x代表相应两个处理器之间不相连。现在求出从第一处理器到另一个处理器最少需要的最长时间。

分析

了解了题意之后,就会发现这是个赤裸裸的单源最短路径了,然后找出dis数组里的最大值即可。

代码

#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<cstdio>
#define INF 0x7f7f7f
#define MAXN 200
using namespace std;
char str[MAXN];
int path[MAXN][MAXN];
int n;
int dis[MAXN],pre[MAXN];
bool vis[MAXN];
void Dijkstra(int start){
int i,j,k;
int min;
for(int i=1;i<=n;i++){
vis[i] = false;
if(i!=start){
dis[i] = path[start][i];
pre[i]=start;
}
}
dis[start] = 0;
vis[start] = true;
for(i=1;i<=n-1;i++){
min=INF;
k=0;
for(j=1;j<=n;j++){
if(!vis[j] && dis[j]<min){
min = dis[j];
k = j;
}
}
if(k==0) return;
vis[k] = true;
for(j=1;j<=n;j++){
if(!vis[j] && path[k][j]!=INF && dis[j]>dis[k]+path[k][j]){
dis[j]=dis[k]+path[k][j];
pre[j]=k;
}
}
}
}

int main(){
while(~scanf("%d",&n)){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
path[i][j]=path[j][i]=INF;
}
}
//memset(path,INF,sizeof(path));
for(int i=2;i<=n;i++){
for(int j=1;j<i;j++){
scanf("%s",str);
if(str[0]!='x'){
path[i][j]=path[j][i]=atoi(str);
}
}
}

Dijkstra(1);
int big=-1;
for(int i=2;i<=n;i++){
big = big>dis[i] ? big : dis[i];
}
printf("%d\n",big);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: