【数据结构的魅力】008.图
图
自定义简单的图结构
点集
import java.util.ArrayList;//点结构的描述
public class Node {public int value;//入度public int in;//出度public int out;public ArrayList<Node> nexts;public ArrayList<Edge> edges;public Node(int value){this.value = value;in = 0;out = 0;nexts = new ArrayList<>();edges = new ArrayList<>();}
}
边集
public class Edge{public int weight;public Node from;public Node to;public Edge(int weight,Node from,Node to){this.weight = weight;this.from = from;this.to = to;}
}
图集
import java.util.HashMap;
import java.util.HashSet;public class Graph {public HashMap<Integer,Node> nodes;public HashSet<Edge> edges;public Graph(){nodes = new HashMap<>();edges = new HashSet<>();}
}
其他问题转化为此自定义结构的接口
public class GraphGenerator {public static Graph createGraph(Integer[][] matrix){Graph graph = new Graph();for(int i=0;i<matrix.length;i++){Integer weight = matrix[i][0];Integer from = matrix[i][1];Integer to = matrix[i][2];if(!graph.nodes.containsKey(from)){graph.nodes.put(from,new Node(from));}if(!graph.nodes.containsKey(to)){graph.nodes.put(to,new Node(to));}Node fromNode = graph.nodes.get(from);Node toNode = graph.nodes.get(to);Edge newEdge = new Edge(weight,fromNode,toNode);fromNode.nexts.add(toNode);fromNode.out++;toNode.in++;fromNode.edges.add(newEdge);graph.edges.add(newEdge);}return graph;}}
广度优先
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Queue;public class BFS {public static void bfs(Node node){if(node == null){return;}Queue<Node> queue = new LinkedList<>();HashSet<Node> set = new HashSet<>();queue.add(node);set.add(node);while (!queue.isEmpty()){Node cur = queue.poll();System.out.println(cur.value);for(Node next : cur.nexts){if(!set.contains(next)){set.add(next);queue.add(next);}}}}
}
深度优先
import java.util.HashSet;
import java.util.Stack;public class DFS {public static void dfs(Node node){if(node == null){return;}Stack<Node> stack = new Stack<>();HashSet<Node> set = new HashSet<>();stack.add(node);set.add(node);System.out.println(node.value);while (!stack.isEmpty()){Node cur = stack.pop();for(Node next : cur.nexts){if(!set.contains(next)){stack.push(cur);stack.push(next);set.add(next);System.out.println(next.value);break;}}}}
}
拓扑排序
import java.util.*;public class TopologySort {public static List<Node> sortedTopology(Graph graph){HashMap<Node,Integer> inMap = new HashMap<>();//只有入度为0的点才能进入队列Queue<Node> zeroInQueue = new LinkedList<>();for(Node node : graph.nodes.values()){inMap.put(node, node.in);if(node.in == 0){zeroInQueue.add(node);}}//拓扑排序的结果,依次加入resultList<Node> result = new ArrayList<>();while (!zeroInQueue.isEmpty()){Node cur = zeroInQueue.poll();result.add(cur);for(Node next : cur.nexts){inMap.put(next,inMap.get(next)-1);if(inMap.get(next) == 0){zeroInQueue.add(next);}}}return result;}
}
【数据结构的魅力】008.图相关推荐
- python函数结构图_Python数据结构与算法之图结构(Graph)实例分析
本文实例讲述了Python数据结构与算法之图结构(Graph).分享给大家供大家参考,具体如下: 图结构(Graph)--算法学中最强大的框架之一.树结构只是图的一种特殊情况. 如果我们可将自己的工作 ...
- python define graph_Python数据结构与算法之图结构(Graph)实例分析
本文实例讲述了Python数据结构与算法之图结构(Graph).分享给大家供大家参考,具体如下: 图结构(Graph)--算法学中最强大的框架之一.树结构只是图的一种特殊情况. 如果我们可将自己的工作 ...
- python棋盘最短路径_Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例...
本文实例讲述了Python数据结构与算法之图的最短路径(Dijkstra算法).分享给大家供大家参考,具体如下: # coding:utf-8 # Dijkstra算法--通过边实现松弛 # 指定一个 ...
- 特征图注意力_从数据结构到算法:图网络方法初探
作者 | 朱梓豪 来源 | 机器之心 原文 | 从数据结构到算法:图网络方法初探 如果说 2019 年机器学习领域什么方向最火,那么必然有图神经网络的一席之地.其实早在很多年前,图神经网络就以图嵌入. ...
- 【数据结构】数据结构知识思维导图
From:https://blog.csdn.net/flowing_wind/article/details/81431354 思维导图源文件: 链接:https://pan.baidu.com/s ...
- 数据结构与算法之-----图(拓扑排序)
[ 写在前面的话:本专栏的主要内容:数据结构与算法. 1.对于初识数据结构的小伙伴们,鉴于后面的数据结构的构建会使用到专栏前面的内容,包括具体数据结构的应用,所使用到的数据 ...
- 数据结构与算法之-----图(搜索算法)
[ 写在前面的话:本专栏的主要内容:数据结构与算法. 1.对于初识数据结构的小伙伴们,鉴于后面的数据结构的构建会使用到专栏前面的内容,包括具体数据结构的应用,所使用到的数据结构,也是自己 ...
- 数据结构(19)图的最小生成树算法
数据结构(19)图的最小生成树算法 前言 普里姆(Prim)算法 克鲁斯卡尔(Kruskal)算法 代码 GraphMtx.h GraphMtx.c Main.c 前言 在有n个顶点的图中,要连接所有 ...
- 天勤2022数据结构(六)图
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 天勤2022数据结构(六)图 前言 一.基础算法 例题 Prim算法 Kruskal算法 Dijkstra算法 Floyd算法 拓扑排 ...
- 【王道数据结构】思维导图--5.2二叉树的概念(高清)
目录:[数据结构]思维导图–(超全大汇总) 上一张:[王道数据结构]思维导图–5.1树与二叉树(高清) 下一张:[王道数据结构]思维导图–5.3二叉树的前中后序遍历和线索二叉树的构造步骤(高清)
最新文章
- 原生JavaScript实现字符串长度截取
- java聚合excel_java操作excel
- wince 自带的web server
- LeetCode 404. Sum of Left Leaves
- 《Java编程思想》Java I/O系统章节阅读笔记
- Sentinel服务熔断配置fallback和blockHandler_削峰填谷_流量控制_速率控制_服务熔断_服务降级---微服务升级_SpringCloud Alibaba工作笔记0052
- Linux 基本命令(九)--vim 常用命令
- JS打印对象的方法将Object转换为String的函数
- 网易互娱-后台开发(支付方向)二面
- 性能优化实战-sql递归查询效率低下
- android 圆形图片,(Android)处理图片成圆形
- 撤消 git rebase
- 深入分析Voldemort的PerformParallelRequests
- 微信扫码点餐小程序怎么做,一步步教你
- Linux系统轻量级监控工具Linux dash的安装方法
- 计算机画图怎么画荷花图片简笔画,画荷花最简单的画法 荷花画图片简单画法...
- 双精度浮点数的取绝对值
- 【python 处理亿级数据】使用 Pandas 处理亿级数据
- laravel db类
- [渝粤教育] 辽宁对外经贸学院 数字新技术 参考 资料
热门文章
- [Vue warn]: Duplicate keys detected: '0'. This may cause an update error. found in解决办法
- DHCP配置 TFTP服务
- 构建大型 Mobx 应用的几个建议
- js原生方式实现bind方法
- 阿里Java开发手册思考(二)
- Android JNI(实现自己的JNI_OnLoad函数)
- F1-VmwareCentOS7.x
- Youtube Links
- matlab hopty,运行Matlab时出现错误?Attempted to access rxd(500); index out of bou
- web服务启动后mysql崩溃_让Web站点崩溃最常见的七大原因