MPI Maelstrom

本文探讨了在具有不同性能的计算机网络中,如何优化消息传播算法以减少总传播时间。通过考虑拓扑结构和计算机间通信成本,提出了一种算法来找到最短传播路径,确保消息能在最短时间内送达所有节点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

实验室有很多台计算机,由于每个人计算机的性能不同,导致计算机之间发送信息的速度不同,所以花费时间不同。

 

消息从第一台电脑发送到第二台电脑后,这两台电脑能再向其他电脑发送消息,就是一种类似二叉树的结构。

 

当然并不是真正的二叉树——我们的计算机有一些特殊的特性,我们应该加以利用。

 

我们的计算机允许同时向连接到它的任意数量的其他计算机发送消息。

 

然而,消息不一定同时到达目的地——这涉及到计算机配置。

 

一般来说,我们需要考虑到拓扑结构中每个计算机的时间成本,并相应地计划将消息传播所需的总时间降到最低。

 

涂爷需要经常给其他人发消息,她想要知道如果她发出一个消息,至少要等多久全部的人才可以都收到通知。

 

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

代码:

#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<iostream>
using namespace std;
const int maxn=100;
const int inf=0x3f3f3f3f;
int e[maxn][maxn];
int dis[maxn];
bool book[maxn];
int n;
void intt()
{
    memset(book,0,sizeof(book));
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            if(i==j) e[i][j]=0;
            else e[i][j]=inf;
    for(int i=1;i<=n;i++)
        dis[i]=inf;
    dis[1]=0;
    book[1]=1;
}
int main()
{
    char c[3];
    while(scanf("%d",&n)!=EOF)
    {
        intt();
        for(int i=2;i<=n;i++)
        {
            for(int j=1;j<i;j++)
            {
                cin>>c;
                if(c[0]!='x')
                    e[i][j]=e[j][i]=atoi(c);
            }
        }
        for(int i=2;i<=n;i++)
            dis[i]=e[1][i];
        for(int i=1;i<=n;i++)
        {
            int u;
            int minn=inf;
            for(int j=1;j<=n;j++)
            {
                if(book[j]==0&&dis[j]<minn)
                {
                    minn=dis[j];
                    u=j;
                }
            }
            book[u]=1;
            for(int v=1;v<=n;v++)
            {
                if(e[u][v]<inf)
                {
                    if(dis[v]>dis[u]+e[u][v])
                        dis[v]=dis[u]+e[u][v];
                }
            }
        }
        int maxx=-1;
        for(int i=2;i<=n;i++)
            maxx=max(maxx,dis[i]);
        printf("%d\n",maxx);
    }
    return 0;
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值