>网络延迟时间<
有 n
个网络节点,标记为 1
到 n
。
给你一个列表 times
,表示信号经过 有向 边的传递时间。 times[i] = (ui, vi, wi)
,其中 ui
是源节点,vi
是目标节点, wi
是一个信号从源节点传递到目标节点的时间。
现在,从某个节点 K
发出一个信号。需要多久才能使所有节点都收到信号?如果不能使所有节点收到信号,返回 -1
。
说明:
1.见上详述
实例1:
输入:times = [[2,1,1],[2,3,1],[3,4,1]], n = 4, k = 2
输出:2
实例2:
输入:times = [[1,2,1]], n = 2, k = 1
输出:1
实例3:
输入:times = [[1,2,1]], n = 2, k = 2
输出:-1
一、解题思路
1、解法一( Java )
解法思路:(迪杰斯特拉算法)Dijkstra 算法(邻接矩阵),即 最短路径 算法,求出各个顶点到起点的距离。如果是连通图,则返回距离中的最大值;如果有顶点不可达,则返回 -1
。
代码如下:
class Solution {
public int findCircleNum(int[][] isConnected) {
//1. 根据已有的数组数据来构造并查集数据结构
int len = isConnected.length;
int circle=0;
int[] parent = new int[len];
//初始化并查集
for(int i=0;i<len;i++){
parent[i] = i;
}
//利用函数构造完整的并查集
for(int x=0;x<len;x++){
for(int y=x+1;y<len;y++){
if(isConnected[x][y]==1){
union(parent,x,y);
}
}
}
//2.遍历查找所有的parent数
for(int i=0;i<len;i++){
if(parent[i]==i){
circle++;
}
}
return circle;
}
//查找index根节点
public int find(int[] parent, int index){
int result =parent[index];
if(result==index){return index;}
else{
return find(parent,result);
}
}
//合并x的根节点到y的根节点(这里需要注意数组是对象,因此是引用传递)
public void union(int[] parent,int x,int y){
parent[find(parent,x)] = find(parent,y);
}
}
运行结果截图如下: