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;也就是說你輸入
的字符串必須是整數並且在整型範圍內才能轉化成功
*/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章