博客
关于我
MPI Maelstrom POJ - 1502 ⭐⭐ 【Dijkstra裸题】
阅读量:401 次
发布时间:2019-03-06

本文共 2582 字,大约阅读时间需要 8 分钟。

实验室有很多台计算机,由于每个人计算机的性能不同,导致计算机之间发送信息的速度不同,所以花费时间不同。
消息从第一台电脑发送到第二台电脑后,这两台电脑能再向其他电脑发送消息,就是一种类似二叉树的结构。
当然并不是真正的二叉树——我们的计算机有一些特殊的特性,我们应该加以利用。
我们的计算机允许同时向连接到它的任意数量的其他计算机发送消息。
然而,消息不一定同时到达目的地——这涉及到计算机配置。
一般来说,我们需要考虑到拓扑结构中每个计算机的时间成本,并相应地计划将消息传播所需的总时间降到最低。
涂爷需要经常给其他人发消息,她想要知道如果她发出一个消息,至少要等多久全部的人才可以都收到通知。

Input

第一行输入一个n,表示有多少台计算机(涂爷当然是一号机啦~)。
随后n-1行,以邻接矩阵的形式给出计算机(1~n)之间通讯需要的时间。
由于两台计算机相互通信时间相等,且计算机自己和自己不需要通信,所以只给出了矩阵的下三角。

ps:x表示由于部分计算机之间存在特殊的磁场并不能通信。

ps2:该题所有数据范围0~100。

Output

输出一行表示涂爷需要等待的时间。.

Examples

Sample Input

55030 5100 20 5010 x x 10Sample Output35

数据只有100,所以便利使用Floyd也是可以的

Floyd

#include
#include
#include
#include
#include
#include
#include
using namespace std;const int maxn = 110;const int inf = 0x3f3f3f3f;int e[maxn][maxn];int n;void floyd() { for (int k = 1; k <= n; ++k) for (int i = 1; i <= n; ++i) for (int j = 1; j <= n; ++j) if (e[i][j] > e[i][k] + e[k][j]) e[i][j] = e[i][k] + e[k][j];}int main() { //freopen("in.txt","r",stdin); ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); cin >> n; char c[20]; for (int i = 1; i <= n; ++i)for (int j = 1; j <= n; ++j)e[i][j] = inf; for (int i = 1; i <= n; ++i)e[i][i] = 0; for(int i = 2;i<=n;++i) for (int j = 1; j <= i - 1; ++j) { cin >> c; if (c[0] == 'x')continue; e[i][j] = e[j][i] = atoi(c); } floyd(); int ans = 0; for (int i = 2; i <= n; i++) { if (e[1][i] != inf) ans = max(ans, e[1][i]); } cout << ans << endl;}

堆优化的Dijkstra

#include
#include
#include
#include
#include
#include
#include
using namespace std;typedef pair
PII;const int inf = 0x3f3f3f3f;const int maxn = 110;int w[maxn][maxn];int dis[maxn];bool book[maxn];int n;void Dijkstra() { priority_queue
, greater
> q; memset(book, false, sizeof book); for (int i = 2; i <= n; ++i)dis[i] = inf; dis[1] = 0; book[0] = true; q.push({ 0,1 }); while (q.size()) { PII cur = q.top(); q.pop(); int u = cur.second; if (book[u])continue; book[u] = true; for (int v = 1; v <= n; ++v) { if (dis[u] + w[u][v] < dis[v]) { dis[v] = dis[u] + w[u][v]; q.push({ dis[v], v }); } } }}int Stoi(string s) { int ret = 0; for (int i = s.length() - 1, j = 1; i >= 0; --i, j *= 10) ret += (s[i] - '0') * j; return ret;}int main() { string input; fill(w[0], w[0] + maxn * maxn, inf); cin >> n; for (int i = 2; i <= n; ++i) for (int j = 1; j < i; ++j) { cin >> input; if (input != "x") w[i][j] = w[j][i] = Stoi(input); } Dijkstra(); int ans = 0; for (int i = 2; i <= n; ++i) ans = max(ans, dis[i]); cout << ans << endl; return 0;}

转载地址:http://qkykz.baihongyu.com/

你可能感兴趣的文章
wxWidgets源码分析(9) - wxString
查看>>
Mybatis Generator最完整配置详解
查看>>
[白话解析] 深入浅出熵的概念 & 决策树之ID3算法
查看>>
[梁山好汉说IT] 梁山好汉和抢劫银行
查看>>
[源码解析] 消息队列 Kombu 之 基本架构
查看>>
[源码分析] 消息队列 Kombu 之 启动过程
查看>>
[源码分析] 消息队列 Kombu 之 Consumer
查看>>
抉择之苦
查看>>
wx.NET CLI wrapper for wxWidgets
查看>>
Silverlight for linux 和 DLR(Dynamic Language Runtime)
查看>>
ASP.NET MVC Action Filters
查看>>
Windows SharePoint Services 3.0 Service Pack 2
查看>>
兰州大学百年校庆--风雨百年萃英路
查看>>
WCF WebHttp Services in .NET 4
查看>>
Powershell中禁止执行脚本解决办法
查看>>
HTTP协议状态码详解(HTTP Status Code)
查看>>
OO_Unit2 多线程电梯总结
查看>>
git clone 出现fatal: unable to access ‘https://github 错误解决方法
查看>>
分布式、高并发、高性能场景(抢购、秒杀、抢票、限时竞答)数据一致性解决方案
查看>>
04_Mysql配置文件(重要参数)
查看>>