Graph、DFS、BFS
Graph.java
package Graph; import LinearLIst.bag.Bag;
import edu.princeton.cs.algs4.In; public class Graph { private final int V; //顶点数目
private int E; //边的数目
private Bag<Integer>[] adj; //邻接表 /*创建一个包含V个顶点但是不包含边的图*/
public Graph(int V){
this.V=V;
this.E=0;
adj=(Bag<Integer>[]) new Bag[V]; //创建邻接表
for(int v=0;v<V;v++) //将所有链表初始化为空
adj[v]=new Bag<Integer>();
} /*从标准输入流读入一幅图*/
public Graph(In in){
this(in.readInt()); //读取V并将图初始化
int E=in.readInt(); //读取E
for (int i=0;i<E;i++){
int v=in.readInt(); //读取一个顶点
int w=in.readInt(); //读取另一个顶点
addEdge(v,w); //添加一条连接他们的边
}
} /**
* 返回图中顶点(结点)数目
*/
public int V(){
return V;
} /**
*返回图中边的数目
*/
public int E(){
return E;
} /*向图中增加一条边v-w */
public void addEdge(int v,int w){
adj[v].add(w); //将W添加到V的链表中
adj[w].add(v); //将V添加到W的链表中
E++;
} /*和v相邻的所有顶点*/
/*返回的是该点的邻接表*/
public Iterable<Integer> adj(int v){
return adj[v];
} /*下面是最常用的图处理操作*/ /*计算v的度数*/
public static int degree(Graph G,int v){
int degree=0;
for (int w:G.adj(v))
degree++;
return degree;
} /*计算所有顶点的最大度数*/
public static int maxDegree(Graph G){
int max=0;
for (int v=0;v<G.V();v++){
if (degree(G,v)>max)
max=degree(G,v);
}
return max;
} /*计算所有顶点的平均度数*/
public static double avgDegree(Graph G){
return 2*G.E()/G.V();
} /*计算子环的个数*/
public static int numberOfSelfLoops(Graph G){
int count=0;
for (int v=0;v<G.V();v++)
for (int w:G.adj(v))
if (v==w)
count++;
return count/2;
} /*图的邻接表的字符串表示*/
public String toString(){
String s=V+" vertices,"+E+" edges\n"; for (int v=0;v<V;v++){
s+=v+": ";
for (int w:this.adj(v))
s+=w+" ";
s+="\n";
}
return s;
} }
DepthFirstSearch.java
package Graph;
public class DepthFirstSearch {
/*marked数组的索引代表一个顶点,元素值代表该点与起点s是否联通*/
private boolean[] marked;
/*与s联通的点的总数*/
/*需要注意的是,这里不是指与s相邻的点的数量*/
/*s与自己是联通的*/
/*即s所在的联通子图中顶点的数量*/
private int count;
/**
*
* @param G 一个图
* @param s s代表图中的起点
*/
public DepthFirstSearch(Graph G,int s){
marked=new boolean[G.V()];
dfs(G,s);
}
private void dfs(Graph G,int v){
marked[v]=true;
count++;
for(int w:G.adj(v)){
if (!marked[w])
dfs(G,w);
}
}
/**
*
* @param w:输入一个顶点
* @return 该顶点是否与起点s联通
*/
public boolean marked(int w){
return marked[w];
}
/**
*
* @return 与s联通的点的总数(所在联通子图的节点数)
*/
public int count(){
return count;
}
}
DepthFirstPaths.java
package Graph; import LinearLIst.stack.Stack;
import edu.princeton.cs.algs4.In; public class DepthFirstPaths {
private boolean[] marked;
private int[] edgeTo;
private final int s; public DepthFirstPaths(Graph G,int s){
marked=new boolean[G.V()];
edgeTo=new int[G.V()];
this.s=s;
dfs(G,s);
} private void dfs(Graph G,int v) {
marked[v] = true;
for (int w : G.adj(v)) {
if (!marked[w]) {
edgeTo[w] = v;
}
}
} public boolean hasPathTo(int v) {
return marked[v];
} public Iterable<Integer> pathTo(int v){
if (!hasPathTo(v))
return null;
Stack<Integer> path=new Stack<Integer>();
for(int x=v;x!=s;x=edgeTo[x])
path.push(x); path.push(s);
return path;
}
}
BreadthFirstSearch.java
package Graph;
import LinearLIst.queue.Queue;
public class BreadthFirstSearch {
/*从起点s到达某个顶点的最短路径是否已知*/
private boolean[] marked;
/*到达该顶点的已知路径上的最后一个顶点*/
/*“最短路径的最后一条边”*/
private int[] edgeTo;
/*起点*/
private final int s;
public BreadthFirstSearch(Graph G,int s){
/*V()返回的是图中顶点的数目*/
marked=new boolean[G.V()];
edgeTo=new int[G.V()];
this.s=s;
bfs(G,s);
}
private void bfs(Graph G,int s){
Queue<Integer> queue=new Queue<Integer>();
marked[s]=true; //标记起点
queue.enqueue(s); //将其加入队列
while(!queue.isEmpty()){
int v=queue.dequeue(); //从队列中删去下一顶点
for (int w:G.adj(v)){
edgeTo[w]=v; //保存最短路径的最后一条边
marked[w]=true; //标记它。因为最短路径已知
queue.enqueue(w); //将它加入到队列中
}
}
}
/*判断一个顶点与s是否联通*/
public boolean hasPathTo(int v){
return marked[v];
}
/*得到一条从s到v的路径*/
/*确保没有从其它s到v的路径所含的边比这条路径更少*/
/*
public Iterable<Integer> pathTo(int v){
if(!hasPathTo(v))
return null;
Stack<Integer> path=new Stack<Integer>();
for(int x=v;x!=s;x=edgeTo[x])
path.push(x);
path.push(s);
return path;
}
*/
}
Graph、DFS、BFS的更多相关文章
- B. Kay and Snowflake 解析(思維、DFS、DP、重心)
Codeforce 685 B. Kay and Snowflake 解析(思維.DFS.DP.重心) 今天我們來看看CF685B 題目連結 題目 給你一棵樹,要求你求出每棵子樹的重心. 前言 完全不 ...
- D. New Year Santa Network 解析(思維、DFS、組合、樹狀DP)
Codeforce 500 D. New Year Santa Network 解析(思維.DFS.組合.樹狀DP) 今天我們來看看CF500D 題目連結 題目 給你一棵有邊權的樹,求現在隨機取\(3 ...
- B. Two Fairs 解析(思維、DFS、組合)
Codeforce 1276 B. Two Fairs 解析(思維.DFS.組合) 今天我們來看看CF1276B 題目連結 題目 給一個連通圖,並給兩個點(\(a,b\)),求有多少點對使得:任一路徑 ...
- D. Maximum Distributed Tree 解析(思維、DFS、組合、貪心、DP)
Codeforce 1401 D. Maximum Distributed Tree 解析(思維.DFS.組合.貪心.DP) 今天我們來看看CF1401D 題目連結 題目 直接看原題比較清楚,略. 前 ...
- DFT、DTFT、DFS、FFT之间的关系
DFT.DTFT.DFS.FFT.FT.FS之间的关系 FT和FS是研究连续信号的,在数字信号处理中不涉及. 主要是前四种的关系: DFT(Discrete Fourier Transform):离散 ...
- 图、dfs、bfs
graphdfsbfs 1.clone graph2.copy list with random pointer3.topological sorting4.permutations5.subsets ...
- 搜索(BFS、DFS、回溯)
这类题是最简单的了都是一个套路,不像动态规划一类题一个套路,没做过就是不会也极难想出来. 一.BFS 解决的问题:用来初始点解决到指定点的最短路径问题,因为图的每一层上的点到初始点的距离相同.(注意是 ...
- BFS、DFS、先序、中序、后序遍历的非递归算法(java)
一 广度优先遍历(BFS) //广度优先遍历二叉树,借助队列,queue public static void bfs(TreeNode root){ Queue<TreeNode> qu ...
- 九度OJ 1091:棋盘游戏 (DP、BFS、DFS、剪枝)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1497 解决:406 题目描述: 有一个6*6的棋盘,每个棋盘上都有一个数值,现在又一个起始位置和终止位置,请找出一个从起始位置到终止位置代 ...
随机推荐
- 云闪付个人免签支付用xposed解决强制升级
云闪付的xposed程序之前用的是6.18的版本,前段时间突然不能用了,提示要升级到最新的7.0版本.之前这个云闪付的个人免签支付程序一直跑的挺好,云闪付也是所有免签支付里面最能跑量的,不甘就这么放弃 ...
- CSS-居中方法汇总
CSS居中是前端工程师经常要面对的问题,也是基本技能之一.今天有时间把CSS居中的方案汇编整理了一下,目前包括水平居中,垂直居中及水平垂直居中方案共15种.如有漏掉的,还会陆续的补充进来. 水平居中 ...
- Java终止线程的三种方式
停止一个线程通常意味着在线程处理任务完成之前停掉正在做的操作,也就是放弃当前的操作. 在 Java 中有以下 3 种方法可以终止正在运行的线程: 使用退出标志,使线程正常退出,也就是当 run() 方 ...
- Java实验报告(一)
Java实验报告(一) 实验过程 1. 打印输出所有的"水仙花数",所谓"水仙花数"是指一个3位数,其中各位数字立方和等于该数本身.例如,153是一个" ...
- 机器学习朴素贝叶斯 SVC对新闻文本进行分类
朴素贝叶斯分类器模型(Naive Bayles) Model basic introduction: 朴素贝叶斯分类器是通过数学家贝叶斯的贝叶斯理论构造的,下面先简单介绍贝叶斯的几个公式: 先验概率: ...
- DataFactory生产手机号码
表中的数据类型是CHAR()类型的,才会出现,如右图的“Build a composite field”的这个功能: 固定部分设置 剩余变化部分设置 操作成功 数据库查询的结果
- 性能测试 | 记一次生产数据库sql由451s优化为0.4s的过程
概述 最近开发说某个接口跑的很慢,排查了下发现其中一条sql,数据量不大,但居然要跑451s,下面简单记录一下优化的过程. 问题sql SELECT l.location_gid ENUMVALUE, ...
- Mysql忘记密码,支持中文,tab补全
忘记Mysql密码: (1)暂停服务: /etc/init.d/mysqld stop (2)跳过grant表授权,进入安全模式,并在后台运行: mysqld_safe --skip-grant-ta ...
- Java同步数据结构之Collection-Queue
概述 接下来开始学习java.util.concurrent包中一些Collection集合的子类,关于Map的一些子类将在这些子类完成之后再开始学习.下图是Java并发包中关于Collection接 ...
- LC 974. Subarray Sums Divisible by K
Given an array A of integers, return the number of (contiguous, non-empty) subarrays that have a sum ...