POJ 1502 MPI Maelstrom「建议收藏」

POJ 1502 MPI Maelstrom「建议收藏」POJ 1502 MPI Maelstrom

大家好,又见面了,我是你们的朋友全栈君。

MPI Maelstrom
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 3896   Accepted: 2330

Description

BIT has recently taken delivery of their new supercomputer, a 32 processor Apollo Odyssey distributed shared memory machine with a hierarchical communication subsystem. Valentine McKee’s research advisor, Jack Swigert, has asked her to benchmark the new system. 

“Since the Apollo is a distributed shared memory machine, memory access and communication times are not uniform,” Valentine told Swigert. “Communication is fast between processors that share the same memory subsystem, but it is slower between processors that are not on the same subsystem. Communication between the Apollo and machines in our lab is slower yet.” 

“How is Apollo’s port of the Message Passing Interface (MPI) working out?” Swigert asked. 

“Not so well,” Valentine replied. “To do a broadcast of a message from one processor to all the other n-1 processors, they just do a sequence of n-1 sends. That really serializes things and kills the performance.” 

“Is there anything you can do to fix that?” 

“Yes,” smiled Valentine. “There is. Once the first processor has sent the message to another, those two can then send messages to two other hosts at the same time. Then there will be four hosts that can send, and so on.” 

“Ah, so you can do the broadcast as a binary tree!” 

“Not really a binary tree — there are some particular features of our network that we should exploit. The interface cards we have allow each processor to simultaneously send messages to any number of the other processors connected to it. However, the messages don’t necessarily arrive at the destinations at the same time — there is a communication cost involved. In general, we need to take into account the communication costs for each link in our network topologies and plan accordingly to minimize the total time required to do a broadcast.”

Input

The input will describe the topology of a network connecting n processors. The first line of the input will be n, the number of processors, such that 1 <= n <= 100. 

The rest of the input defines an adjacency matrix, A. The adjacency matrix is square and of size n x n. Each of its entries will be either an integer or the character x. The value of A(i,j) indicates the expense of sending a message directly from node i to node j. A value of x for A(i,j) indicates that a message cannot be sent directly from node i to node j. 

Note that for a node to send a message to itself does not require network communication, so A(i,i) = 0 for 1 <= i <= n. Also, you may assume that the network is undirected (messages can go in either direction with equal overhead), so that A(i,j) = A(j,i). Thus only the entries on the (strictly) lower triangular portion of A will be supplied. 

The input to your program will be the lower triangular section of A. That is, the second line of input will contain one entry, A(2,1). The next line will contain two entries, A(3,1) and A(3,2), and so on.

Output

Your program should output the minimum communication time required to broadcast a message from the first processor to all the other processors.

Sample Input

5
50
30 5
100 20 50
10 x x 10

Sample Output

35

Source

 

Floyd:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>

using namespace std;

const int N=110;
const int INF=0x3f3f3f3f;

int map[N][N],dis[N],vis[N];
int n;

int main(){

    //freopen("input.txt","r",stdin);

    char str[20];
    while(~scanf("%d",&n)){
        int i,j,k;
        for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
                map[i][j]=(i==j?0:INF);
        for(i=2;i<=n;i++)
            for(j=1;j<i;j++){
                scanf("%s",str);
                if(str[0]=='x')
                    map[i][j]=map[j][i]=INF;
                else
                    map[i][j]=map[j][i]=atoi(str);
            }
        for(k=1;k<=n;k++)
            for(i=1;i<=n;i++)
                for(j=1;j<=n;j++)
                    if(map[i][j]>map[i][k]+map[k][j])
                        map[i][j]=map[i][k]+map[k][j];
        int ans=-INF;
        for(int i=2;i<=n;i++)
            if(ans<map[1][i])
                ans=map[1][i];
        printf("%d\n",ans);
    }
    return 0;
}

 

 

Dijkstra:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>

using namespace std;

const int N=110;
const int INF=0x3f3f3f3f;

int map[N][N],dis[N],vis[N];
int n;

void Dijkstra(int src){
    int i;
    for(i=1;i<=n;i++){
        dis[i]=map[src][i];
        vis[i]=0;
    }
    dis[src]=0;
    vis[src]=1;
    int j,k,tmp;
    for(i=1;i<n;i++){
        tmp=INF;
        for(j=1;j<=n;j++)
            if(!vis[j] && tmp>dis[j]){
                tmp=dis[j];
                k=j;
            }
        if(tmp==INF)
            break;
        vis[k]=1;
        for(j=1;j<=n;j++)
            if(!vis[j] && dis[j]>dis[k]+map[k][j])
                dis[j]=dis[k]+map[k][j];
    }
}

int main(){

    //freopen("input.txt","r",stdin);

    char str[20];
    while(~scanf("%d",&n)){
        int i,j;
        for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
                map[i][j]=(i==j?0:INF);
        for(i=2;i<=n;i++)
            for(j=1;j<i;j++){
                scanf("%s",str);
                if(str[0]!='x')
                    map[i][j]=map[j][i]=atoi(str);
            }
        Dijkstra(1);
        int ans=-INF;
        for(i=2;i<=n;i++)
            if(ans<dis[i])
                ans=dis[i];
        printf("%d\n",ans);
    }
    return 0;
}

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/107094.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 数据结构之图的创建(邻接表)

    数据结构之图的基本概念中了解了图的基本概念,接下来对图的代码实现进行详解。邻接无向图1.邻接表无向图介绍邻接表无向图是指通过邻接表表示的无向图。上面的图G1包含了"A,B,C,D,

    2021年12月19日
    58
  • Vue高阶组件_高阶组件的承上启下

    Vue高阶组件_高阶组件的承上启下目录一、高阶组件概念二、目标三、思路四、准备五、实现六、难点Reference一、高阶组件概念何谓高阶组件?类比高阶函数的定义:将函数作为参数的函数就是高阶函数,那么,将组件作为参数的组件就是高阶组件。二、目标假如我们有一个组件,我们希望通过某个函数,去扩展它,得到一个新的组件,新的组件有完全的参数组件的行为,如果这点可以满足,那么其他扩展就可以针对性的…

    2025年7月27日
    5
  • 打开python 报R6034 错误

    打开python 报R6034 错误我只在Python3和python2同时在anaconda3下安装出现的问题,后来移除python2也不起作用,找到了这个方法,解决的问题。6034指的是:”AnapplicationhasmadeanattempttoloadtheCruntimelibraryincorrectly.Pleasecontacttheapplication’ssuppor…

    2025年8月3日
    4
  • 文件下载,带转码-&gt;pdf-&gt;swf

    文件下载,带转码-&gt;pdf-&gt;swf

    2022年1月31日
    41
  • mysql 乱码 latin1_mysql 数据库 latin1 导致的乱码

    mysql 乱码 latin1_mysql 数据库 latin1 导致的乱码很多年以前遇到 mysql 的乱码问题 最近又遇到了 mysql 这货 默认的编码是 latin1 例如 latin1 swedish ci 实在不明白为什么是这样 而最近 10 年 主流的编码方式已经是 utf8 mysql 中 最初采用 utf8 generalci 与其匹配 后来逐渐地使用 utf8unicode ci 与其匹配 比较神奇的是 有时候 mysql 数据库已经从 lati

    2026年1月16日
    1
  • python中%d_python中%d是什么「建议收藏」

    python中%d表示格式化一个对象为十进制整数。使用后,在需要输出的长字符串中占位置。输出字符串时,可以依据变量的值,自动更新字符串的内容。使用示例:num=14#%d打印时结果是14print(“num=%d”%num)#output:num=14#%1d意思是打印结果为1位整数,当整数的位数超过1位时,按整数原值打印,所以%1d的打印结果还是14print(“nu…

    2022年4月10日
    2.1K

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号