MPI Maelstrom POJ - 1502(最短路)

题目链接
实验室有很多台计算机,由于每个人计算机的性能不同,导致计算机之间发送信息的速度不同,所以花费时间不同。
消息从第一台电脑发送到第二台电脑后,这两台电脑能再向其他电脑发送消息,就是一种类似二叉树的结构。
当然并不是真正的二叉树——我们的计算机有一些特殊的特性,我们应该加以利用。
我们的计算机允许同时向连接到它的任意数量的其他计算机发送消息。
然而,消息不一定同时到达目的地——这涉及到计算机配置。
一般来说,我们需要考虑到拓扑结构中每个计算机的时间成本,并相应地计划将消息传播所需的总时间降到最低。
涂爷需要经常给其他人发消息,她想要知道如果她发出一个消息,至少要等多久全部的人才可以都收到通知。
Input
第一行输入一个n,表示有多少台计算机(涂爷当然是一号机啦~)。
随后n-1行,以邻接矩阵的形式给出计算机(1~n)之间通讯需要的时间。
由于两台计算机相互通信时间相等,且计算机自己和自己不需要通信,所以只给出了矩阵的下三角。
ps:x表示由于部分计算机之间存在特殊的磁场并不能通信。
ps2:该题所有数据范围0~100。
Output
输出一行表示涂爷需要等待的时间。.
Sample Input
5
50
30 5
100 20 50
10 x x 10
Sample Output
35

题意思路:给你一个不完全的矩阵,数字表示权值,x表示两点间不可达,由于自身到自身花费的时间为0,所以没有给出,由于i到j和j到i距离相同,互达时间相同,所以只给出了一半的临界矩阵。
根据给你的这个临界矩阵,让你来求从点1到其他点所花费最短时间集里面的的最大值。
代码:一:floyd解法

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <stdlib.h>
using namespace std;
#define N 110
#define INF 0xfffffff
int maps[N][N], n;
void floyd()
{
    for(int k=1; k<=n; k++)
        for(int i=1; i<=n; i++)
            for(int j=1; j<=n; j++)
            {
                maps[i][j]=min(maps[i][k]+maps[k][j], maps[i][j]);
            }
}
int main()
{
    while(scanf("%d", &n)!=EOF)
    {
        memset(maps, 0, sizeof(maps));
        for(int i=2; i<=n; i++)
        {
            for(int j=1; j<i; j++)
            {
                char s[10];
                scanf("%s", s);
                if(s[0]=='x')
                    maps[i][j] = maps[j][i] = INF;
                else
                {
                    /*虽然明白这段代码的作用是把输入的字符型数据转化为整型数据,但是不明白为什么这么写,
                    网上也搜不到,就先用atoi函数代替了,以后再向大佬学习吧
                    int num = 0;
                    for(int k=0; s[k]; k++)
                        num = num*10 + s[k]-'0';
                    maps[i][j] = maps[j][i] = num;
                    */
                    maps[i][j] = maps[j][i] = atoi(s);
                }
            }
        }
        floyd();
        int Max=0;
        for(int i=1; i<=n; i++)
            Max = max(Max, maps[1][i]);
        printf("%d\n", Max);
    }
    return 0;
}
/*
 atoi(s)函数用于把一个字符串转换为一个整型数据,该函数定义在stdlib.h中
#include<iostream.h>
#include<stdlib.h>
int main()
{
char s[100];
int b;
gets(s);
b=atoi(s);
cout<<b<<endl;
return 0;
}
比如你输入的是12345;则它先被读入到字符串s中,用atoi()函数可以把它转
化成一个整数,如果转化成功,则返回转化后的整数此时b=12345,否则返回0;
再比如你输入abcde,那么转化失败,此时它返回值为0,故b=0;也就是说你输入
的字符串必须是整数并且在整型范围内才能转化成功
*/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章