MPI Maelstrom
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 7471   Accepted: 4550

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
题意:给出结点数,用邻接矩阵给出每个节点的距离,因为结点i到结点i的距离为0以及路径是双向的所以只给出邻接矩阵对角线的左下半块。
下面分别用求最短路径的方法实现
/*
dijkstra 1502 Accepted 428K 0MS G++
*/
#include"cstdio"
#include"cstring"
#include"algorithm"
using namespace std;
const int MAXN=;
const int INF=0x3fffffff;
int mp[MAXN][MAXN];
int V;
int dijkstra(int s)
{
int d[MAXN];
int vis[MAXN];
for(int i=;i<=V;i++)
{
vis[i]=;
d[i]=mp[s][i];
} int n=V;
while(n--)
{
int mincost,k;
mincost=INF;
for(int i=;i<=V;i++)
{
if(!vis[i]&&mincost>d[i])
{
mincost=d[i];
k=i;
}
} vis[k]=;
for(int i=;i<=V;i++)
{
if(!vis[i]&&d[i]>d[k]+mp[k][i])
{
d[i]=d[k]+mp[k][i];
}
}
} int ans=-;
for(int i=;i<=V;i++) ans=max(ans,d[i]);
return ans;
}
int main()
{
while(scanf("%d",&V)!=EOF)
{
for(int i=;i<=V;i++)
for(int j=;j<=i;j++)
if(i==j) mp[i][j]=;
else{
char x[];
scanf("%s",x);
if(x[]=='x') mp[i][j]=mp[j][i]=INF;
else mp[i][j]=mp[j][i]=atoi(x);
} printf("%d\n",dijkstra());
}
return ;
}
/*
堆优化dijkstra 1502 1502 Accepted 632K 0MS G++
*/
#include"cstdio"
#include"cstring"
#include"algorithm"
#include"vector"
#include"queue"
using namespace std;
const int MAXN=;
const int INF=0X3fffffff;
struct Edge{
int to,cost;
Edge(){}
Edge(int to,int cost)
{
this->to=to;
this->cost=cost;
}
friend bool operator<(const Edge &a,const Edge &b)
{
return a.cost < b.cost;
}
};
vector<Edge> G[MAXN];
int V;
int dijkstra(int s)
{
int d[MAXN];
for(int i=;i<=MAXN;i++) d[i]=INF;
d[s]=; priority_queue<Edge> que;
que.push(Edge(s,));
while(!que.empty())
{
Edge e=que.top();que.pop();
int v=e.to;
if(d[v]<e.cost) continue;
for(int i=;i<G[v].size();i++)
{
Edge ek=G[v][i];
if(d[ek.to]>d[v]+ek.cost)
{
d[ek.to]=d[v]+ek.cost;
que.push(Edge(ek.to,d[ek.to]));
}
}
}
int ans=-;
for(int i=;i<=V;i++)
if(d[i]<INF)
ans=max(ans,d[i]);
return ans;
}
int main()
{
while(scanf("%d",&V)!=EOF)
{
for(int i=;i<=V;i++)
G[i].clear();
for(int i=;i<=V;i++)
for(int j=;j<=i;j++)
if(i==j){
G[i].push_back(Edge(j,));
G[j].push_back(Edge(i,));
}
else{
char x[];
scanf("%s",x);
if(x[]=='x') ;
else{
G[j].push_back(Edge(i,atoi(x)));
G[i].push_back(Edge(j,atoi(x)));
}
}
printf("%d\n",dijkstra());
}
return ;
}
/*
ford 1502 Accepted 444K 0MS G++
*/
#include"cstdio"
#include"cstring"
#include"algorithm"
using namespace std;
const int MAXN=;
const int INF=0X3fffffff;
struct Edge{
int from,to,cost;
}es[MAXN];
int V,E;
int ford(int s)
{
int d[MAXN];
for(int i=;i<=V;i++) d[i]=INF;
d[s]=; while(true)
{
bool update=false;
for(int i=;i<E;i++)
{
Edge e=es[i];
if(d[e.from]!=INF&&d[e.to]>d[e.from]+e.cost)
{
d[e.to]=d[e.from]+e.cost;
update=true;
}
}
if(!update) break;
}
int ans=-;
for(int i=;i<=V;i++)
{
if(d[i]<INF) ans=max(ans,d[i]);
}
return ans;
}
int main()
{
while(scanf("%d",&V)!=EOF)
{
E=;
for(int i=;i<=V;i++)
for(int j=;j<i;j++)
{
char x[];
scanf("%s",x);
if(x[]!='x')
{
es[E].from=i,es[E].to=j,es[E++].cost=atoi(x);
es[E].from=j,es[E].to=i,es[E++].cost=atoi(x);
}
} printf("%d\n",ford());
} return ;
}
/*
poj1502 spfa Accepted 232K 16MS C++
*/
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#include<vector>
using namespace std;
const int MAXN=;
const int INF=0x3fffffff;
struct Edge{
int to,w;
Edge(){}
Edge(int cto,int cw):to(cto),w(cw){}
};
vector<Edge> mp[MAXN];
int n;
int d[MAXN],vis[MAXN];
void spfa(int s)
{
memset(vis,,sizeof(vis));
for(int i=;i<=n;i++)
d[i]=INF;
queue<int> que;
d[s]=,vis[s]=;
que.push(s);
while(!que.empty())
{
int now=que.front();que.pop();
vis[now]=;
for(int i=;i<mp[now].size();i++)
{
Edge e=mp[now][i];
if(d[e.to]>d[now]+e.w)
{
d[e.to]=d[now]+e.w;
if(!vis[e.to])
{
vis[e.to]=;
que.push(e.to);
}
}
}
}
int res=;
for(int i=;i<=n;i++)
res=max(d[i],res);
printf("%d\n",res);
}
int main()
{
while(scanf("%d",&n)!=EOF)
{ for(int i=;i<=n;i++)
mp[i].clear();
for(int i=;i<=n;i++)
for(int j=;j<i;j++)
{
char x[]="\0";
scanf("%s",x);
if(x[]=='x') continue;
else
{
int l=atoi(x);
mp[i].push_back(Edge(j,l));
mp[j].push_back(Edge(i,l));
}
}
spfa();
}
}
/*
floyd 1502 Accepted 428K 0MS G++
*/
#include"cstdio"
#include"algorithm"
using namespace std;
const int MAXN=;
const int INF=0X3fffffff;
int mp[MAXN][MAXN];
int V;
int main()
{
while(scanf("%d",&V)!=EOF)
{
for(int i=;i<=V;i++)
for(int j=;j<=i;j++)
{
if(i==j){
mp[i][j]=;
continue;
}
char x[];
scanf("%s",x);
if(x[]!='x') mp[i][j]=mp[j][i]=atoi(x);
else mp[i][j]=mp[j][i]=INF;
} for(int k=;k<=V;k++)
for(int i=;i<=V;i++)
for(int j=;j<=V;j++)
mp[i][j]=min(mp[i][j],mp[i][k]+mp[k][j]);
int ans=-;
for(int i=;i<=V;i++)
if(mp[][i]<INF)
ans=max(mp[][i],ans); printf("%d\n",ans);
} return ;
}

POJ1502(最短路入门题)的更多相关文章

  1. hdu 3695:Computer Virus on Planet Pandora(AC自动机,入门题)

    Computer Virus on Planet Pandora Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 256000/1280 ...

  2. poj 2524:Ubiquitous Religions(并查集,入门题)

    Ubiquitous Religions Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 23997   Accepted:  ...

  3. poj 3984:迷宫问题(广搜,入门题)

    迷宫问题 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7635   Accepted: 4474 Description ...

  4. hdu 1754:I Hate It(线段树,入门题,RMQ问题)

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  5. poj 3254 状压dp入门题

    1.poj 3254  Corn Fields    状态压缩dp入门题 2.总结:二进制实在巧妙,以前从来没想过可以这样用. 题意:n行m列,1表示肥沃,0表示贫瘠,把牛放在肥沃处,要求所有牛不能相 ...

  6. zstu.4194: 字符串匹配(kmp入门题&& 心得)

    4194: 字符串匹配 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 206  Solved: 78 Description 给你两个字符串A,B,请 ...

  7. hrbustoj 1073:病毒(并查集,入门题)

    病毒Time Limit: 1000 MS Memory Limit: 65536 KTotal Submit: 719(185 users) Total Accepted: 247(163 user ...

  8. hdu 1465:不容易系列之一(递推入门题)

    不容易系列之一 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Sub ...

  9. hrbustoj 1545:基础数据结构——顺序表(2)(数据结构,顺序表的实现及基本操作,入门题)

    基础数据结构——顺序表(2) Time Limit: 1000 MS    Memory Limit: 10240 K Total Submit: 355(143 users) Total Accep ...

随机推荐

  1. zabbix-agent active 配置自动探测

    1. zabbix-agent 被动模式配置文件: PidFile=/var/run/zabbix/zabbix_agentd.pid LogFile=/var/log/zabbix/zabbix_a ...

  2. redis问题接囧办法及经验

    转自:https://my.oschina.net/freegeek/blog/324410 1.redis持久化,来自官方说明 如何选择使用哪种持久化方式? 一般来说, 如果想达到足以媲美 Post ...

  3. JAVA学习第五十二课 — IO流(六)File对象

    File类 用来给文件或者目录封装成对象 方便对文件与目录的属性信息进行操作 File对象能够作为參数传递给流的构造函数 一.构造函数和分隔符 public static void FileDemo( ...

  4. Double Check Locking 双检查锁机制

    方法保证了多线程并发下的线程安全性.这里在声明变量时使用了volatile关键字来保证其线程间的可见性:在同步代码块中使用二次检查,以保证其不被重复实例化.集合其二者,这种实现方式既保证了其高效性,也 ...

  5. mysql系列之8.mysql高可用 (mha4mysql)

    环境: 三台机器 主服务器: 192.168.1.130 主备机器: 192.168.1.131 监控机器: 192.168.1.132 130和131, 是mysql双主架构 1.在三台机器上安装m ...

  6. iOS 10 权限配置大全

    <!-- 相册 --> <key>NSPhotoLibraryUsageDescription</key> <string>App需要您的同意,才能访问 ...

  7. JavaEE与Spring

    在Java社区中,Spring与Java EE之争是个永恒的话题.在这场争论中,来自两个阵营的布道师.架构师与铁杆粉丝都在不遗余力地捍卫着本方的尊严,并试图说服对方加入到自己的阵营当中,但结果却是双方 ...

  8. UITableViewCell的多选操作

    版权声明:本文为博主原创文章.未经博主同意不得转载,转载需加上原博客链接. https://blog.csdn.net/panyong4627/article/details/37902207 - ( ...

  9. SAP增强 和VA01相关增强点介绍

    -转 sap寻找用户出口方法 sap的用户出口总共有三代: 一.User EXIT 第一代的用户出口,它们include在SAP标准程序的源代码里,可以说他们是源代码的一部分,你改了这种出口就相当于改 ...

  10. ruby 字符串

    字符串处理函数 1.返回字符串的长度 str.length => integer 2.判断字符串中是否包含另一个串 str.include? other_str => true or fa ...