图的深度优先遍历的六种应用附Java代码

目录

无向图的连通分量个数

单纯求出了连通分量个数 

能具体返回哪几个点是同一个连通分量

路径问题

单源路径问题

从某个顶点到另一个顶点的路径问题

检测无向图中的环

二分图的检测


无向图的连通分量个数

单纯求出了连通分量个数 

import java.util.ArrayList;public class CC {private Graph G;private int[] visited;private int cccount = 0;public CC(Graph G){this.G = G;visited = new int[G.V()];for(int i = 0; i < visited.length; i ++)visited[i] = -1;for(int v = 0; v < G.V(); v ++)if(visited[v] == -1){dfs(v, cccount);cccount ++;}}private void dfs(int v, int ccid){visited[v] = ccid;for(int w: G.adj(v))if(visited[w] == -1)dfs(w, ccid);}public int count(){
//        for(int e: visited)
//            System.out.print(e + " ");
//        System.out.println();return cccount;}public boolean isConnected(int v, int w){G.validateVertex(v);G.validateVertex(w);return visited[v] == visited[w];}public ArrayList<Integer>[] components(){ArrayList<Integer>[] res = new ArrayList[cccount];for(int i = 0; i < cccount; i ++)res[i] = new ArrayList<Integer>();for(int v = 0; v < G.V(); v ++)res[visited[v]].add(v);return res;}public static void main(String[] args){Graph g = new Graph("g.txt");CC cc = new CC(g);System.out.println(cc.count());System.out.println(cc.isConnected(0, 6));System.out.println(cc.isConnected(5, 6));ArrayList<Integer>[] comp = cc.components();for(int ccid = 0; ccid < comp.length; ccid ++){System.out.print(ccid + " : ");for(int w: comp[ccid])System.out.print(w + " ");System.out.println();}}
}

能具体返回哪几个点是同一个连通分量

import java.util.ArrayList;public class CC{private Graph G;private boolean[] visited;private int cccount = 0;
public CC(Graph G){this.G = G;visited = new int[G.V()];
for(int i = 0; i < visited.length; i++)
{visited[i] = -1;
}
for(int v = 0; v < G.V(); v++){if(visited[V] == -1){dfs(v, ccount);cccount++;}}
private void dfs(int v, int ccid){visited[v] = ccid;
for(int w : G.adj(v)){if(visited[w] == -1){dfs(w, ccid);}}}
public int count(){for(int e : visited){System.out.print(e + " ");
}System.out.println();return cccount;}
public static void main(String[] args){Graph g = new Graph("g.txt");CC cc = new GraphDFS(g);System.out.println(cc.count());}}
}

路径问题

单源路径问题

import java.util.ArrayList;
import java.util.Collections;public class SingleSourcePath {private Graph G;private int s;private int[] pre;public SingleSourcePath(Graph G, int s){this.G = G;this.s = s;pre = new int[G.V()];for(int i = 0; i < pre.length; i ++)pre[i] = -1;dfs(s, s);}private void dfs(int v, int parent){pre[v] = parent;for(int w: G.adj(v))if(pre[w] == -1)dfs(w, v);}public boolean isConnectedTo(int t){G.validateVertex(t);return pre[t] != -1;}public Iterable<Integer> path(int t){ArrayList<Integer> res = new ArrayList<Integer>();if(!isConnectedTo(t)) return res;int cur = t;while(cur != s){res.add(cur);cur = pre[cur];}res.add(s);Collections.reverse(res);return res;}public static void main(String[] args){Graph g = new Graph("g.txt");SingleSourcePath sspath = new SingleSourcePath(g, 0);System.out.println("0 -> 6 : " + sspath.path(6));System.out.println("0 -> 5 : " + sspath.path(5));}
}

从某个顶点到另一个顶点的路径问题

import java.util.ArrayList;
import java.util.Collections;public class Path {private Graph G;private int s, t;private int[] pre;private boolean[] visited;public Path(Graph G, int s, int t){G.validateVertex(s);G.validateVertex(t);this.G = G;this.s = s;this.t = t;visited = new boolean[G.V()];pre = new int[G.V()];for(int i = 0; i < pre.length; i ++)pre[i] = -1;dfs(s, s);for(boolean e: visited)System.out.print(e + " ");System.out.println();}private boolean dfs(int v, int parent){visited[v] = true;pre[v] = parent;if(v == t) return true;for(int w: G.adj(v))if(!visited[w])if(dfs(w, v))return true;return false;}public boolean isConnected(){return visited[t];}public Iterable<Integer> path(){ArrayList<Integer> res = new ArrayList<Integer>();if(!isConnected()) return res;int cur = t;while(cur != s){res.add(cur);cur = pre[cur];}res.add(s);Collections.reverse(res);return res;}public static void main(String[] args){Graph g = new Graph("g.txt");Path path = new Path(g, 0, 6);System.out.println("0 -> 6 : " + path.path());Path path2 = new Path(g, 0, 5);System.out.println("0 -> 5 : " + path2.path());Path path3 = new Path(g, 0, 1);System.out.println("0 -> 1 : " + path3.path());}
}

检测无向图中的环

思路:找到一个已经被访问过的结点,并且这个结点不是当前节点的上一个结点。

public class CycleDetection {private Graph G;private boolean[] visited;private boolean hasCycle = false;public CycleDetection(Graph G){this.G = G;visited = new boolean[G.V()];for(int v = 0; v < G.V(); v ++)if(!visited[v])if(dfs(v, v)){hasCycle = true;break;}}// 从顶点 v 开始,判断图中是否有环private boolean dfs(int v, int parent){visited[v] = true;for(int w: G.adj(v))if(!visited[w]){if(dfs(w, v)) return true;}else if(w != parent)return true;return false;}public boolean hasCycle(){return hasCycle;}public static void main(String[] args){Graph g = new Graph("g.txt");CycleDetection cycleDetection = new CycleDetection(g);System.out.println(cycleDetection.hasCycle());Graph g2 = new Graph("g2.txt");CycleDetection cycleDetection2 = new CycleDetection(g2);System.out.println(cycleDetection2.hasCycle());}
}

二分图的检测

思路:从某一点开始逐个染色。

 

 

import java.util.ArrayList;public class BipartitionDetection {private Graph G;private boolean[] visited;private int[] colors;private boolean isBipartite = true;public BipartitionDetection(Graph G){this.G = G;visited = new boolean[G.V()];colors = new int[G.V()];for(int i = 0; i < G.V(); i ++)colors[i] = -1;for(int v = 0; v < G.V(); v ++)if(!visited[v])if(!dfs(v, 0)){isBipartite = false;break;}}private boolean dfs(int v, int color){visited[v] = true;colors[v] = color;for(int w: G.adj(v))if(!visited[w]){if(!dfs(w, 1 - color)) return false;}else if(colors[w] == colors[v])return false;return true;}public boolean isBipartite(){return isBipartite;}public static void main(String[] args){Graph g = new Graph("g.txt");BipartitionDetection bipartitionDetection = new BipartitionDetection(g);System.out.println(bipartitionDetection.isBipartite);// trueGraph g2 = new Graph("g2.txt");BipartitionDetection bipartitionDetection2 = new BipartitionDetection(g2);System.out.println(bipartitionDetection2.isBipartite);// falseGraph g3 = new Graph("g3.txt");BipartitionDetection bipartitionDetection3 = new BipartitionDetection(g3);System.out.println(bipartitionDetection3.isBipartite);// true}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/175547.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DoLa:对比层解码提高大型语言模型的事实性

DoLa&#xff1a;对比层解码提高大型语言模型的事实性 摘要1 引言2 方法2.1 事实知识在不同层级上演化2.2 动态早期层选择2.3 预测对比 3 实验3.1 任务3.2 实验设置3.3 多项选择3.3.1 TruthfulQA&#xff1a;多项选择3.3.2 FACTOR&#xff1a;维基、新闻 3.4 开放式文本生成3.4…

SUE3000 1VCF750090R804 REM615面板

SUE3000 1VCF750090R804 REM615面板 蓝色波长激光的特殊特性使扫描仪适用于各种材料的高精度轮廓和尺寸测量&#xff0c;包括闪亮的表面、炽热的发光金属、有机材料(如食品、木材和木质单板)&#xff0c;以及透明或半透明材料&#xff0c;如塑料、玻璃、光学元件和薄膜/基底。…

【波形图】LabVIEW中的波形图和波形图表有什么区别?

波形图和波形图表在显示和更新数据的方式上有所不同。 波形图可接受各种类型的数据阵列&#xff0c;例如数组&#xff0c;波形或动态数据。波形图在接收到数据后将立即绘制所有接收到的数据点 。波形图不接受单点值。当您将包含数据点的数组连接到波形图时&#xff0c;波形图会…

Syntax Error: TypeError: this.getOptions is not a function的解决(Vue)

报错信息&#xff1a; TypeError: this.getOptions is not a function 这个是在运行项目是遇到的问题 这个报错是类型错误&#xff0c;this.getOptions 不是一个函数 。这个错误一般就是less-loader库里的错误。 主要是less-loader版本太高&#xff0c;不兼容this.getOptions…

AntDB数据库荣获 “2023年信创物联网优秀服务商”

日前&#xff0c;在2023世界数字经济大会暨第十三届智博会 2023京甬信创物联网产融对接会上&#xff0c;AntDB数据库再获殊荣&#xff0c;获评“2023年信创物联网优秀服务商”。 图1&#xff1a;2023年信创物联网优秀服务商颁奖现场 信创物联网是信息技术应用创新与物联网的结…

高并发和存储之间的关系是什么?

文章目录 &#x1f50a;博主介绍&#x1f916;博主的简介&#x1f4e5;博主的目标 &#x1f964;本文内容&#x1f34a; 一、高并发对存储的压力&#x1f34a; 二、存储的性能和可扩展性 &#x1f4e2;总结 &#x1f50a;博主介绍 &#x1f4d5;我是廖志伟&#xff0c;一名Java…

【C语言初学者周冲刺计划】2.2用选择法对10个整数从小到大排序

目录 1解题思路&#xff1a; 2代码如下&#xff1a; 3运行结果: 4总结&#xff1a; 1解题思路&#xff1a; 首先利用一维数组和循环语句输入10个整数&#xff0c;然后利用双循环的嵌套进行比较大小&#xff0c;最后输出结果&#xff1b; 2代码如下&#xff1a; #include&…

[SWPUCTF 2021 新生赛]hardrce_3 无字母rce 自增

这里是过滤了 取反等符号 所以考虑自增 <?php header("Content-Type:text/html;charsetutf-8"); error_reporting(0); highlight_file(__FILE__); if(isset($_GET[wllm])) {$wllm $_GET[wllm];$blacklist [ ,\^,\~,\|];foreach ($blacklist as $blackitem){if …

一个小妙招从Prompt菜鸟秒变专家!加州大学提出PromptAgent,帮你高效使用ChatGPT!

夕小瑶科技说 原创 作者 | 谢年年、王二狗 有了ChatGPT、GPT4之后&#xff0c;我们的工作学习效率得到大大提升&#xff08;特别在凑字数方面୧(๑•̀◡•́๑)૭&#xff09;。 作为一个工具&#xff0c;有人觉得好用&#xff0c;自然也有人觉得难用。 要把大模型用得6&am…

Linux Spug自动化运维平台公网远程访问

文章目录 前言1. Docker安装Spug2 . 本地访问测试3. Linux 安装cpolar4. 配置Spug公网访问地址5. 公网远程访问Spug管理界面6. 固定Spug公网地址 前言 Spug 面向中小型企业设计的轻量级无 Agent 的自动化运维平台&#xff0c;整合了主机管理、主机批量执行、主机在线终端、文件…

群晖上搭建teamspeak3语音服务器

什么是 TeamSpeak &#xff1f; TeamSpeak &#xff08;简称 TS&#xff09;是一款团队语音通讯工具&#xff0c;但比一般的通讯工具具有更多的功能而且使用方便。它由服务器端程序和客户端程序两部分组成&#xff0c;如果不是想自己架设 TS 服务器&#xff0c;只需下载客户端程…

linux后台运行python脚本

前言 我们在运行程序时&#xff0c;有的程序花费时间较多&#xff0c;但我们总不能一直看着程序运行&#xff0c;所以我在这里记录一下&#xff0c;Linux服务器如何后台运行我们的脚本程序 实现后台运行程序 我们登录到服务器&#xff0c;切换至目录到我们所要运行的程序下 …

基于SSM的航空订票系统

基于SSM的航空订票系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringSpringMVCMyBatis工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 用户界面 管理员界面 摘要 基于SSM的航空订票系统是一款面向旅客、航空公司和旅…

org.springframework.cloud:spring-cloud-starter-openfeign:jar is missing详解

openfeign无法导入的问题 我感觉最近带的好几个新人在搭建springCloud基础框架的时候&#xff0c;会犯一个非常小的错误&#xff0c;导致进度卡住了。 这个错误就是Feign导入的错误&#xff1a; ‘dependencies.dependency.version’ for org.springframework.cloud:spring-c…

大数据平台发展及Hudi简要复习

第一代数据仓库——Vertica 最初&#xff0c;Uber使用MySQL作为他们的主要数据存储。然而&#xff0c;随着业务的扩展和数据量的增长&#xff0c;他们开始需要一个更强大的解决方案来进行大规模的数据分析和处理。 因此&#xff0c;Uber选择了Vertica作为他们的第一代数据仓库…

leetcode第369周赛

2917. 找出数组中的 K-or 值 给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。 nums 中的 K-or 是一个满足以下条件的非负整数&#xff1a; 只有在 nums 中&#xff0c;至少存在 k 个元素的第 i 位值为 1 &#xff0c;那么 K-or 中的第 i 位的值才是 1 。 返回 nums …

2.数据结构-链表

概述 目标 链表的存储结构和特点链表的几种分类及各自的存储结构链表和数组的差异刷题(反转链表) 概念及存储结构 先来看一下动态数组 ArrayList 存在哪些弊端 插入&#xff0c;删除时间复杂度高需要一块连续的存储空间&#xff0c;对内存要求比较高&#xff0c;比如要申请…

NUXT前端服务端渲染技术框架

服务端渲染又称SSR&#xff08;Server Side Render&#xff09;实在服务端完成页面的内容&#xff0c;而不是在客户端通过AJAX获取数据 优势&#xff1a;更好的SEO&#xff0c;由于搜索引擎爬虫抓取工具可以直接查看完全渲染的页面 Nuxt.js是一个基于Vue.js的轻量级应用框架&a…

【WSL 2】Windows10 安装 WSL 2,并配合 Windows Terminal 和 VSCode 使用

【WSL 2】Windows10 安装 WSL 2&#xff0c;并配合 Windows Terminal 和 VSCode 使用 1 安装 Windows Terminal2 安装 WSL 23 在 Windows 文件资源管理器中打开 WSL 项目4 在 VSCode 中使用 WSL 24.1 必要准备4.2 从 VSCode 中 Connect WSL4.3 从 Linux 中打开 VSCode 1 安装 W…

计算机网络第3章-TCP协议(2)

TCP拥塞控制 TCP拥塞控制的三种方式&#xff1a; 慢启动、拥塞避免、快速恢复 慢启动 当一条TCP连接开始时&#xff0c;cwnd的值是一个很小的MSS值&#xff0c;这使得初始发送速率大约为MSS/RTT。 在慢启动状态&#xff0c;cwnd的值以1个MSS开始并且每当传输的报文段首次被…