问题与解答

问题描述

有N个网络节点,标记为1到N。

给定一个二维数组times[M][3],表示信号经过有向边的传递时间。times[i][3] = {u, v, w}, 其中u是源节点,v是目标节点,w是一个信号从源节点传递到目标节点的时间,即二维数组中的一行表示一条带权有向边。

现在,我们向当前的节点K 发送一个信号。最少需要多长时间才能使所有节点都收到信号?如果不能使所有节点收到信号,返回-1。

注意:

1、 M的范围在[1,50]之间

2、 N的范围在[1, 20] 之间。

3、 K的范围在[1, N] 之间。

4、 所有的边times[i][3] =(u, v, w)都有1 <= u, v <= N 且 1 <= w <= 50。

问题输入

多行输入数据,第1行为3个正整数,分别是M,N,K。接下来有M行,每行有3个正整数,分别是u, v, w。

**问题输出 **

输出一个数,表示需要多久才能使所有节点都收到信号。如果不能使所有节点收到信号,返回-1

输入样例

3 4 2

2 1 1

2 3 1

3 4 1

输出样例

2

//网络时延
//最短路径问题: Dijstra
#include<stdio.h>
#include<algorithm>
using namespace std;
#define MaxN 100 //最大顶点数
#define INF 10000
int N; //顶点数
int G[MaxN][MaxN]; //邻接矩阵保存图G
int d[MaxN]; //d[u] = num:顶点u到起点的距离为num,初始化为INF
bool Vis[MaxN] = {false}; //Vis[i] == true:顶点i已被访问
int Dijstra(int s); //Dijstra算法,输入起点s int main(){
int M,K,Min_Length;
int i,j;
int u,v,w;
fill(G[0],G[0]+MaxN*MaxN,0); //初始化图G
scanf("%d%d%d",&M,&N,&K); //读入图G的边
for(i = 0; i < M; i++){
scanf("%d%d%d",&u,&v,&w);
G[u-1][v-1] = w;
}
Min_Length = Dijstra(K-1); //调用Dijstra算法
printf("%d", Min_Length); //打印最短路径
} int Dijstra(int s){
fill(d,d+N,INF);
d[s] = 0;
int i,u,v,Min;
for(i = 0; i < N; i++){ //循环N次
u = -1, Min = INF;
for(v = 0; v < N; v++){ //未访问 && 距离起点最近的点
if(Vis[v] == false && d[v] < Min){
u = v;
Min = d[v];
}
}
if(u == -1) return -1; //不连通,返回-1
Vis[u] = true;
for(v = 0; v < N; v++){ //以u为中介点优化u未被访问的邻接点
if(Vis[v] == false && G[u][v] != 0 && d[u]+G[u][v] < d[v])
d[v] = d[u] + G[u][v];
}
} int Min_Length = -1; //返回结果
for(u = 0; u < N; u++){
if(d[u] > Min_Length)
Min_Length = d[u];
}
return Min_Length;
}

题后反思

用fill初始化数组

  • 一维:fill(d,d+N,INF);
  • 二维:fill(G[0], G[0]+MaxN * MaxN, 0);

编号问题

编号从1开始计时,G的顶点编号以及传入Dijstra的起点K的编号都 == 读入编号 - 1

最新文章

  1. boost库的使用
  2. 搭建nginx+tomcat+Java的负载均衡环境
  3. MVC5中,加载分部视图,常见的方式
  4. Alpha版本十天冲刺——Day 3
  5. Spring中的事物管理,用 @Transactional 注解声明式地管理事务
  6. 使用grunt打包ueditor源代码
  7. ogrinfo使用
  8. string与stringBuilder的效率与内存占用实测
  9. TYVJ P1053 字符串的展开 Label:字符 水
  10. extern “C”调用测试与验证-2016.01.06
  11. SQL SERVER 中 实现主表1行记录,子表多行记录 整合成一条虚拟列
  12. CSharp SQLServer 登陆
  13. Go语言学习笔记(四)结构体struct &amp; 接口Interface &amp; 反射
  14. Es6 Symbol.iterator
  15. pwnable.kr input解题记录
  16. Django的form表单
  17. linux系统基础入门
  18. ubutu强制关闭应用程序的方法
  19. norbert-构建服务器集群感知的 Java 应用程序
  20. Android-Java-进程与线程

热门文章

  1. oracle 锁查询
  2. android知识点duplicateParentState
  3. zabbix之二进制安装
  4. supervise安装与使用
  5. Spring Boot,Spring Cloud,Spring Cloud Alibaba 版本选择说明以及整理归纳
  6. NoSQL之Redis学习笔记
  7. 测试工具_webbench
  8. 自定义 UITableViewCell 的 accessory 样式
  9. String类源码分析
  10. [BUUCTF]REVERSE——easyre