链式前向星+dijkstra
https://leetcode-cn.com/problems/network-delay-time/submissions/
// n <= 100
class Solution {
int N = 105, M = 6005;
// (邻接表-链式前向星)
int[] w = new int[M]; // 边的权重
int[] edge = new int[M]; // 边指向的节点
int[] head = new int[N]; // 存储的是某个节点的链表(节点指向边的结合)的第一个节点
int[] next = new int[M]; // 表示链表中的下一条边 int[] dist = new int[N]; // 起点到i的最短路
boolean[] vis = new boolean[N]; int n, k;
int idx = 0;
int inf = 0x3f3f3f3f; void add(int a, int b, int c) {
// 链表中添加新节点
w[idx] = c;
edge[idx] = b;
next[idx] = head[a]; head[a] = idx;
idx++;
} void dijkstra() {
// 起始先将所有的点标记为「未更新」和「距离为正无穷」
Arrays.fill(dist, inf);
Arrays.fill(vis, false);
// 只有起点最短距离为 0
dist[k] = 0;
// (点编号, 到起点的距离)
PriorityQueue<int[]> pq = new PriorityQueue<>((x, y) -> {
return x[1] - y[1];
});
pq.offer(new int[]{k, 0});
while (!pq.isEmpty()) {
int[] poll = pq.poll();
int index = poll[0], distance = poll[1];
if (vis[index]) continue;
vis[index] = true;
// 标记该点「已更新」,并使用该点更新其他点的「最短距离」
for (int i = head[index]; i != -1; i = next[i]) { // 链表最末端都是-1
int to = edge[i];
if (dist[to] > dist[index] + w[i]) {
dist[to] = dist[index] + w[i];
pq.offer(new int[]{to, dist[to]});
}
}
}
} public int networkDelayTime(int[][] times, int n, int k) {
this.n = n;
this.k = k;
// 初始化每个节点的链表的头结点
Arrays.fill(head, -1);
// 建图
for (int[] time: times) {
int from = time[0], to = time[1], val = time[2];
add(from, to, val);
}
// 最短路
dijkstra();
// 遍历答案
int ans = 0;
for (int i = 1; i <= n; i++) {
ans = Math.max(ans, dist[i]);
}
return ans == inf? -1: ans;
}
}
进阶:https://leetcode-cn.com/problems/count-nodes-with-the-highest-score/solution/gong-shui-san-xie-jian-tu-dfs-by-ac_oier-ujfo/
// 链式前向星 求 每一个节点能到达的节点数量
class Solution {
int[] cnt;
int N = 100010, M = 100010 * 2;
int[] head = new int[N];
int[] next = new int[M];
int[] edge = new int[M]; int idx = 0;
void add(int x, int y) {
edge[idx] = y;
next[idx] = head[x];
head[x] = idx;
idx++;
} public int countHighestScoreNodes(int[] parents) {
int n = parents.length;
cnt = new int[n];
Arrays.fill(head, -1); for (int i = 0; i < n; i++) {
int from = parents[i];
int to = i;
if (from == -1) continue;
add(from, to);
} // dfs
dfs(0);
long maxVal = 0L;
int maxNum = 0;
for (int i = 0; i < n; i++) {
long tmp = 0;
if (parents[i] == -1) { // 根节点
long res = 1;
for (int j = head[i]; j != -1; j = next[j]) {
int to = edge[j];
res *= cnt[to];
}
tmp = res;
} else if (head[i] == -1) { // 叶子节点
tmp = n-1;
} else { // 非叶子节点
long res = 1;
for (int j = head[i]; j != -1; j = next[j]) {
int to = edge[j];
res *= cnt[to];
}
tmp = res * (n-cnt[i]);
}
if (tmp > maxVal) {
maxVal = tmp;
maxNum = 1;
} else if (tmp == maxVal) {
maxNum++;
}
}
return maxNum;
} // 求以u为根节点的子树的节点数量
public int dfs(int u) {
int num = 1;
// 遍历所有的边
for (int i = head[u]; i != -1; i = next[i]) {
int to = edge[i];
num += dfs(to);
}
cnt[u] = num;
return num;
}
}
链式前向星+dijkstra的更多相关文章
- [poj3159]Candies(差分约束+链式前向星dijkstra模板)
题意:n个人,m个信息,每行的信息是3个数字,A,B,C,表示B比A多出来的糖果不超过C个,问你,n号人最多比1号人多几个糖果 解题关键:差分约束系统转化为最短路,B-A>=C,建有向边即可,与 ...
- 单元最短路径算法模板汇总(Dijkstra, BF,SPFA),附链式前向星模板
一:dijkstra算法时间复杂度,用优先级队列优化的话,O((M+N)logN)求单源最短路径,要求所有边的权值非负.若图中出现权值为负的边,Dijkstra算法就会失效,求出的最短路径就可能是错的 ...
- 洛谷P3371单源最短路径Dijkstra版(链式前向星处理)
首先讲解一下链式前向星是什么.简单的来说就是用一个数组(用结构体来表示多个量)来存一张图,每一条边的出结点的编号都指向这条边同一出结点的另一个编号(怎么这么的绕) 如下面的程序就是存链式前向星.(不用 ...
- 【最短路】Dijkstra+ 链式前向星+ 堆优化(优先队列)
Dijkstra+ 链式前向星+ 优先队列 Dijkstra算法 Dijkstra最短路算法,个人理解其本质就是一种广度优先搜索.先将所有点的最短距离Dis[ ]都刷新成∞(涂成黑色),然后从起点 ...
- Floyd && Dijkstra +邻接表 +链式前向星(真题讲解来源:城市路)
1381:城市路(Dijkstra) 时间限制: 1000 ms 内存限制: 65536 KB提交数: 4066 通过数: 1163 [题目描述] 罗老师被邀请参加一个舞会,是 ...
- 模板 Dijkstra+链式前向星+堆优化(非原创)
我们首先来看一下什么是前向星. 前向星是一种特殊的边集数组,我们把边集数组中的每一条边按照起点从小到大排序,如果起点相同就按照终点从小到大排序, 并记录下以某个点为起点的所有边在数组中的起始位置和 ...
- HDU 2544最短路 【dijkstra 链式前向星+优先队列优化】
最开始学最短路的时候只会用map二维数组存图,那个时候还不知道这就是矩阵存图,也不懂得效率怎么样 经过几个月的历练再回头看最短路的题, 发现图可以用链式前向星来存, 链式前向星的效率是比较高的.对于查 ...
- 链式前向星+SPFA
今天听说vector不开o2是数组时间复杂度常数的1.5倍,瞬间吓傻.然后就问好的图表达方式,然后看到了链式前向星.于是就写了一段链式前向星+SPFA的,和普通的vector+SPFA的对拍了下,速度 ...
- hdu2647 逆拓扑,链式前向星。
pid=2647">原文地址 题目分析 题意 老板发工资,可是要保证发的工资数满足每一个人的期望,比方A期望工资大于B,仅仅需比B多1元钱就可以.老板发的最低工资为888元.输出老板最 ...
- 图的存储结构:邻接矩阵(邻接表)&链式前向星
[概念]疏松图&稠密图: 疏松图指,点连接的边不多的图,反之(点连接的边多)则为稠密图. Tips:邻接矩阵与邻接表相比,疏松图多用邻接表,稠密图多用邻接矩阵. 邻接矩阵: 开一个二维数组gr ...
随机推荐
- ssgvip设置
ssgvip.tpl set service "{vipport}" protocol {xieyi} src-port 0-65535 dst-port {vipport}-{v ...
- 【azw3】麻省理工深度思考法:从模型及动力机制来思考现象
书本详情 标题:麻省理工深度思考法:从模型及动力机制来思考现象作者:[日]平井孝志 著:张玉虹 译年份:2018出版社:北京:中国华侨出版社ISBN:9787511373441,7511373445格 ...
- 关于.net core连接数据库字符串加密查询 (DES加密)
des加密获取的乱码是相对一致的 所以只需要获取到加密乱码在api后台解密就好 1.创建一个控制台用来获取加密后的乱码 using System; using System.Collections. ...
- html表白代码
1.在电脑桌面右击鼠标选择新建--文本文档 2.并命名为:biaobai.txt 3.打开并且把一下代码复制并粘贴到biaobai.txt <!DOCTYPE html PUBLIC " ...
- Day22:数据库导入&分工&准备科研训练
今日完成的任务: 1.与组员共同排查jar包中的问题,发现是由于未导入数据库. 网上查询后在MySQL workbench中完成了导入导出(图中user数据库). 2.完成实验报告分工,我负责结论部分 ...
- 报错解决OSError: /lib64/libm.so.6: version `GLIBC_2.27' not found
使用pyg报错如下: 1 Traceback (most recent call last): 2 File "main.py", line 18, in <module&g ...
- [vsCode]Visual Studio Code左侧导航栏图标丢失
人在摸鱼,闲着没事看了看没用过的git窗口,然后右键把导航栏快捷图标关了 打开设置(Ctrl+,),搜索sidebar 编辑 settings.json { "window.zoomLeve ...
- ERA5气压层数据驱动WRF的一些问题
感谢Dawn的建议,兰溪之水的WRF教程 参考了一些经验,并结合实际后,成功用ERA5驱动WRF.实际上,用ERA5数据驱动WRF的方法和用ERA-Interim 数据驱动WRF极其类似. 总结几点是 ...
- https代理服务器(四)java动态签发【失败】
https://zhuanlan.zhihu.com/p/355241710?utm_id=0 http://t.zoukankan.com/xiaxj-p-8961131.html https:// ...
- xd p4 WEB源码拓展
WEB 源码在安全测试中是非常重要的信息来源,可以用来代码审计漏洞也可以用来做信息突破口,其中 WEB 源码有很多技术需要简明分析. 知识点 关于 WEB 源码目录结构 后台目录.模板目录.数据库目录 ...