博客
关于我
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/

你可能感兴趣的文章
【博客网站搭建】1.零成本零基础搭建属于自己的博客或网站
查看>>
【Android】7.Activity传递Bundle数据
查看>>
【Android】8.Activity通过Serializable方式传递对象
查看>>
【Android】9.Activity通过Parcelable方式传递对象
查看>>
【Android】13.全局获取Context
查看>>
【Android踩过的坑】7.Android Studio 点击启动项目时进入调试模式
查看>>
【Android小技巧】1.快速查看SDK对应的API Level
查看>>
【复习笔记】HTML基础理论知识
查看>>
【面试准备】Spring、SpringMVC、Struts2、MyBatis、Hibernate优缺点
查看>>
【自学Flutter】4.1 Material Design字体图标的使用(icon)
查看>>
【自学Flutter】32 交错动画的使用
查看>>
P1276 校门外的树(增强版)
查看>>
POJ 3278 Catch That Cow
查看>>
C++清空队列(queue)方法
查看>>
关于unsigned long long
查看>>
POJ 3279 Fliptile
查看>>
Problem-2162 Find a way
查看>>
【换行符】什么时候用cin.get()吃掉输入流中的换行符
查看>>
【二叉树】已知后序与中序求先序
查看>>
1142 Maximal Clique (25 分)
查看>>