【poj 1502】 MPI Maelstrom 【East Central North America 1996】
2017-11-05 20:44
302 查看
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
Sample Output
这道题是求从1号节点出发的最短路中最长的一条,由于题目给出的是稠密图,所以使用dijkstra算法,下面是程序:#include<stdio.h>
#include<queue>
#include<string.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
const int N=105;
struct edge{
int v,w;
edge *next;
}*head
;
struct node{
int v,w;
bool operator <(node p)const{
return w<p.w;
}
};
int d
;
void make(edge *&x){
x=(edge *)(malloc(sizeof(edge)));
}
void add(int u,int v,int w){
edge *x;
make(x);
x->v=v;
x->w=w;
x->next=head[u];
head[u]=x;
}
priority_queue<node>q;
void dijkstra(int s){
memset(d,0x7f,sizeof(d));
node tp;
tp.v=s;
tp.w=0;
q.push(tp);
while(!q.empty()){
tp=q.top();
q.pop();
int u=tp.v,w=tp.w;
if(w>d[u]){
continue;
}
d[u]=w;
edge *now=head[u];
while(now){
int v=now->v;
if(d[u]+now->w<d[v]){
tp.v=v;
tp.w=d[u]+now->w;
q.push(tp);
}
now=now->next;
}
}
}
int read(){
int s=0;
char c=getchar();
while((c<'0'||c>'9')&&c!='x'){
c=getchar();
}
if(c=='x'){
return -1;
}
while(c>='0'&&c<='9'){
s*=10;
s+=c-'0';
c=getchar();
}
return s;
}
int main(){
int n,i,j,w;
while(~scanf("%d",&n)){
memset(head,0,sizeof(head));
for(i=2;i<=n;i++){
for(j=1;j<i;j++){
w=read();
if(w!=-1){
add(i,j,w);
add(j,i,w);
}
}
}
dijkstra(1);
for(i=1,w=0;i<=n;i++){
w=max(w,d[i]);
}
printf("%d\n",w);
}
return 0;
}
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
这道题是求从1号节点出发的最短路中最长的一条,由于题目给出的是稠密图,所以使用dijkstra算法,下面是程序:#include<stdio.h>
#include<queue>
#include<string.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
const int N=105;
struct edge{
int v,w;
edge *next;
}*head
;
struct node{
int v,w;
bool operator <(node p)const{
return w<p.w;
}
};
int d
;
void make(edge *&x){
x=(edge *)(malloc(sizeof(edge)));
}
void add(int u,int v,int w){
edge *x;
make(x);
x->v=v;
x->w=w;
x->next=head[u];
head[u]=x;
}
priority_queue<node>q;
void dijkstra(int s){
memset(d,0x7f,sizeof(d));
node tp;
tp.v=s;
tp.w=0;
q.push(tp);
while(!q.empty()){
tp=q.top();
q.pop();
int u=tp.v,w=tp.w;
if(w>d[u]){
continue;
}
d[u]=w;
edge *now=head[u];
while(now){
int v=now->v;
if(d[u]+now->w<d[v]){
tp.v=v;
tp.w=d[u]+now->w;
q.push(tp);
}
now=now->next;
}
}
}
int read(){
int s=0;
char c=getchar();
while((c<'0'||c>'9')&&c!='x'){
c=getchar();
}
if(c=='x'){
return -1;
}
while(c>='0'&&c<='9'){
s*=10;
s+=c-'0';
c=getchar();
}
return s;
}
int main(){
int n,i,j,w;
while(~scanf("%d",&n)){
memset(head,0,sizeof(head));
for(i=2;i<=n;i++){
for(j=1;j<i;j++){
w=read();
if(w!=-1){
add(i,j,w);
add(j,i,w);
}
}
}
dijkstra(1);
for(i=1,w=0;i<=n;i++){
w=max(w,d[i]);
}
printf("%d\n",w);
}
return 0;
}
相关文章推荐
- POJ 1016 测试数据( East Central North America 1998 Numbers That Count Test data )
- POJ 1240 Pre-Post-erous! && East Central North America 2002 (由前序后序遍历序列推出M叉树的种类)
- POJ 1028 / East Central North America 2001 Web Navigation (栈)
- 2014-2015 ACM-ICPC East Central North America Regional Contest (ECNA 2014)
- 2005-2006 ACM-ICPC East Central North America Regional Contest (ECNA 2005) F.Square Count
- UVa 757 / POJ 1042 / East Central North America 1999 Gone Fishing (枚举&贪心&想法题&优先队列)
- East Central North America 2004 I Conduit!
- 2010 East Central North America Region F 题 Pro-Test Voting 解题报告
- ACM ICPC East Central North America 1994_Simply Syntax
- UVa 755 / POJ 1002 / East Central North America 1999 487--3279 (排序)
- hdu 1063 Exponentiatio(East Central North America 1988)
- Gym 101196 (East Central North America Regional Contest 2016)
- East Central North America 1999 "Gone Fishing"
- 2012-2013 ACM-ICPC East Central North America Regional Contest (ECNA 2012)
- East Central North America 2006
- 2005-2006 ACM-ICPC East Central North America Regional Contest (ECNA 2005) H.Two Ends
- 2005-2006 ACM-ICPC East Central North America Regional Contest (ECNA 2005) G.Swamp Things
- POJ 1502 MPI Maelstrom(Dijkstra)
- poj 1502 MPI Maelstrom (dij)
- Poj 1502 MPI Maelstrom (Dijkstra