【9001】Internet消息发布
Time Limit: 1 second
Memory Limit: 256 MB
问题描述
设Internet上有N个站点,通常从一个站点发送消息给其他N-1个站点,需依次发送N-1次。这样从一个站点发布消息传遍N个站点时
,可能要较长时间。而当一个站点发布消息给另一个站点后,已获得消息的这两个站点就可以 发布消息给另外两个站点,此后
就有四个站点可以同时发布消息,这种发布消息方法应该会缩短消息传遍N个站点的时间。
请您编一个程序,设从每一个站点都可以向其他N-1个站点同时发送消息,编程求出从第一个站点开始发布消息传遍N个站点的
最短时间。
Input
由文件data.in输入数据,文件的第一行是Internet上的站点数N(1<=N<=100),第二行起是邻接矩阵严格的下三角部分
,各行是整数或字符X。A(I, J)表示从I站点发送消息给J站点所需要的时间。假设网络是无方向的,故A(I, J)=A(J, I),当A
(I, J)=-1时,表示从站点I不能直接向站点J发送消息;A(I,I)=0表示没有必要自己给自己送消息(1<=I<=N),严格的下三
角阵表示如下:
A(2, 1)
A(3, 1), A(3, 2)
A(4, 1), A(4, 2), A(4, 3)
┇
A(N, 1), A(N, 2)……A(N, N-1)
Output
从屏幕上输出,输出只有一行,它是一个非负整数,若为0表示无解,非0表示合符题意的最小整数。
Sample Input
5
50
30 5
100 20 50
10 -1 -1 10
Sample Output
35
【题解】
算出站点1到各个站点的最短路径。然后找到站点1到各个站点的最短距离的最大值。
这个最大值就是所求的最短时间。
题目说的意思就是说有n-1个人在站点1,然后分别走到其他n-1个站点,那最短的时间就是最晚到的那个人,只要每个人都走最优的路线,那么最晚的那个人所用的时间就是最短的了。
用dijkstra算法。
【代码】
#include <cstdio>
#include <cstring> int n,t[110][110],a[110][110],mt[110],ans = 0;
bool bo[110]; void input_data()
{
memset(a,0,sizeof(a));
memset(bo,true,sizeof(bo));
scanf("%d",&n);
for (int i = 1;i <= n;i++)
mt[i] = 2100000000;
for (int i = 2;i <= n;i++) //输入数据
for (int j = 1;j <=i-1;j++)
{
scanf("%d",&t[i][j]);
if (t[i][j]!=-1) //如果不等于-1,则表示i和j是连通的
{
a[i][++a[i][0]] = j;//记录i的出度信息
a[j][++a[j][0]] = i;//记录j的出度信息
t[j][i] = t[i][j];//全值是双向的。
}
}
} void get_ans()
{
mt[1] = 0;
for (int i = 1;i <= n;i++) //进行dijkstra算法。
{
int k = 0,min_n = 2100000000;
for (int j = 1;j <= n;j++) //先找到mt最小的值
if (bo[j] && (mt[j] < min_n)) //同时还要是之前没找过的位置
min_n = mt[j],k = j;
if (k == 0) break;//如果没有找到这样的位置 那么就不再找,结束就好
bo[k] = false;
for (int j = 1;j <= a[k][0];j++) //根据其出度信息,更新到出度的最优解。
if (mt[a[k][j]] > mt[k] + t[k][a[k][j]])
mt[a[k][j]] = mt[k] + t[k][a[k][j]];
}
for (int i = 1;i <= n;i++) //找到最优解中的最大值。这个值就是答案。
if (mt[i]!=2100000000 && mt[i] > ans)
ans = mt[i];
} void output_ans()
{
printf("%d\n",ans);
} int main()
{
//freopen("F:\\rush.txt","r",stdin);
input_data();
get_ans();
output_ans();
return 0;
}
【9001】Internet消息发布的更多相关文章
- redis 的消息发布订阅
redis支持pub/sub功能(可以用于消息服务器),这个功能类似mq,这里做一个简单的介绍 Pub/Sub Pub/Sub 从字面上理解就是发布(Publish)与订阅(Subscribe),在R ...
- SLAM+语音机器人DIY系列:(二)ROS入门——5.编写简单的消息发布器和订阅器
摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...
- vue_组件间通信:自定义事件、消息发布与订阅、槽
自定义事件 只能用于 子组件 向 父组件 发送数据 可以取代函数类型的 props 在父组件: 给子组件@add-todo-event="addTodo" 在子组件: 相关方法中, ...
- Redis的消息发布和订阅
Redis的消息发布和订阅 Author:SimpleWu GitHub-redis 什么是消息发布和订阅? Redis 发布订阅(pub/sub)是一种进程间的消息通信模式: 发送者(pub)发送消 ...
- redis:消息发布与订阅频道
1. 发布与订阅频道 消息发布与订阅像收音机与广播台的关系 1.1. publish channel message 发布频道 语法:publish channel message 作用:发布频道消息 ...
- springboot2.X 集成redis+消息发布订阅
需求场景:分布式项目中,每个子项目有各自的 user 数据库, 在综合管理系统中存放这所有用户信息, 为了保持综合管理系统用户的完整性, 子系统添加用户后将用户信息以json格式保存至redis,然后 ...
- ROS学习(十二)—— 编写简单的消息发布器和订阅器(C++)
一.创建发布器节点 1 节点功能: 不断的在ROS网络中广播消息 2 创建节点 (1)打开工作空间目录 cd ~/catkin_ws/src/beginner_tutorials 创建一个发布器节点( ...
- ROS 消息发布器和订阅器Publisher, Subscriber
博客参考:https://www.2cto.com/kf/201705/639776.html 1.编写发布器节点节点(Node) 是指 ROS 网络中可执行文件.接下来,将会创建一个发布器节点(“t ...
- redis实现消息发布/订阅
redis实现简单的消息发布/订阅模式. 消息订阅者: package org.common.component; import org.slf4j.Logger; import org.slf4j. ...
随机推荐
- 对快速排序的分析 Quick Sort
快速排序 快排的基本思想是:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序.通常可选第一个记录为基准 ...
- laravel 分页带参数
{{$data->appends(request()->except(['page']))->links()}}
- 【JZOJ4783】【NOIP2016提高A组模拟9.15】Osu
题目描述 输入 输出 样例输入 4 2 1 2 2 2 0 2 3 0 0 4 2 0 样例输出 1 2 1 数据范围 样例解释 圆圈只在出现的时刻有效.即:时刻t_i时鼠标位置恰好在(x_i,y_i ...
- fedora下eclipse安装tomcat插件
首先下载tomcat插件: http://www.eclipsetotale.com/tomcatPlugin.html,下载最新的3.3版本: 由于我的eclipse是通过yum自动安装的,因此ec ...
- dba和表的备份与恢复
每个oracle数据库应该至少有一名数据库管理员(dba),对于一个小的数据库,一个dba就够了,但是对于一个大的数据库可能需要多个dba分别担负不同的管理职责.那么一个数据库管理员的主要工作是什么呢 ...
- Error configuring application listener of class org.springframework.web.context.ContextLoaderListene 标签: tomcat
今天敲完ssm框架,启动tomcat时报了这个错误.如图: SEVERE: Error configuring application listener of class org.springfram ...
- Ubuntu 16.04下OLSR协议安装教程
OLSR是根据MANET的要求,在传统的LS(Link state)协议的基础上优化的. OLSR中的关键概念是多点转播(MPRs),MPRs是在广播洪泛的过程中挑选的转发广播的节点.传统的链路状态协 ...
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十六章:实例化和截头锥体裁切
原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十六章:实例化和截头锥体裁切 代码工程地址: https://git ...
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十四章:曲面细分阶段
原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十四章:曲面细分阶段 代码工程地址: https://github. ...
- phpexcel导出数据库成excel文件
<?php error_reporting(E_ALL); date_default_timezone_set('Europe/London'); /** PHPExcel */ require ...