BIT公司最近推出了一台新的超级计算机,一台32处理器的阿波罗奥德赛分布式共享内存机,带有分层通信子系统。瓦伦丁·麦基的研究顾问杰克·斯威格特(JackSwigert)要求她对新系统进行基准测试。
瓦伦丁对斯威格特说:“由于阿波罗是一台分布式共享内存机器,内存访问和通信时间并不一致。”`共享相同内存子系统的处理器之间的通信速度较快,但不在同一子系统上的处理器之间的通信速度较慢。阿波罗号和我们实验室的机器之间的通讯速度还比较慢。
“阿波罗的信息传递接口(MPI)端口工作得如何?”斯威格问。
“不太好,”瓦朗蒂娜回答。`要从一个处理器向所有其他n-1处理器广播消息,他们只需执行n-1发送的序列。它真正地序列化了一些事情并扼杀了表演。
“你能做些什么来解决这个问题吗?”
“是的,”瓦朗蒂娜笑着说。“有。一旦第一个处理器将消息发送给另一个处理器,这两个处理器就可以同时向另外两个主机发送消息。然后将有四个主机可以发送,以此类推。
“啊,这样你就可以像二叉树那样做广播了!”
“不是真正的二叉树-我们的网络有一些特殊的特性,我们应该加以利用。我们拥有的接口卡允许每个处理器同时向连接到它的任意数量的其他处理器发送消息。然而,这些信息不一定同时到达目的地-这涉及到通信费用。一般来说,我们需要考虑到网络拓扑中每个链路的通信成本,并相应地进行规划,以尽量减少广播所需的总时间。
输入
输入将描述连接n个处理器的网络的拓扑结构。输入的第一行将是n,处理器数,例如1<=n<=100。
输入的其余部分定义了一个邻接矩阵。A.邻接矩阵是正方形的,大小为n×n。它的每个条目要么是整数,要么是字符x。A(i,j)的值表示直接从节点I发送消息到节点j的开销。A(i,j)的x值表示消息不能从节点I直接发送到节点j。
请注意,对于一个节点向自己发送消息不需要网络通信,因此A(i,i)=0表示1<=i<=n。此外,您可以假设网络是无向的(消息可以相同的开销向任意方向移动),这样A(i,j)=A(j,i)。因此,只有A的(严格的)下三角部分上的条目将被提供。
您的程序的输入将是A的下三角段,即第二行输入将包含一个条目,A(2,1)。下一行将包含两个条目,A(3,1)和A(3,2),等等。
输出量
您的程序应该输出从第一个处理器向所有其他处理器广播消息所需的最小通信时间。
样本输入
5
50
30 5
100 20 50
10 x x 10
样本输出
35
题目大意:N个处理器要进行信息传递,处理器i传递信息给自己不需要时间,处理器i与处理器j之间相互传递信息的时间是一样的,不同处理器之间传递信息所需要的时间由一个矩阵的下三角给出。若矩阵对应位置为x,则说明相应的两个处理器之间无法传递信息。求从第一个处理器传递信息到其他所有处理器最少需要多少时间。
通信可以同步,所有最后求的是最大值,一下可以传完。atoi(s)函数,就是把字符串中的s转化为数字,在<stdlib.h>中。
代码:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=100+10;
const int INF=(1<<30);
int Map[maxn][maxn],dis[maxn],m,n,vis[maxn];
void init()
{
for(int i=0;i<=n;i++)
for(int j=0;j<=n;j++)
if(i!=j) Map[i][j]=INF;
else Map[i][j]=0;
}
void Dijkstra(int src)
{
int i,j,minn,pos;
memset(vis,0,sizeof(vis));
for(i = 1; i<=n; i++)
dis[i] = INF;
dis[src] = 0;
for(i = 1; i<=n; i++)
{
minn = INF;
pos = 0;
for(j = 1; j<=n; j++)
{
if( !vis[j]&&minn>dis[j] )
{
pos = j;
minn= dis[j];
}
}
vis[pos] = 1;
for(j = 1; j<=n; j++)
{
if(dis[j]>dis[pos]+Map[pos][j]&&Map[pos][j]!=INF)
{dis[j] = dis[pos]+Map[pos][j];}
}
}
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
init();
for(int i=1;i<=n;i++)
for(int j=1;j<i;j++)
{
char s[10];
scanf("%s",s);
if(s[0]!='x') Map[i][j]=Map[j][i]=atoi(s);
}
Dijkstra(1);
int ans=-1;
for(int i=2;i<=n;i++)
{
ans=max(ans,dis[i]);
}
printf("%d",ans);
}
}