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的更多相关文章

  1. B. Kay and Snowflake 解析(思維、DFS、DP、重心)

    Codeforce 685 B. Kay and Snowflake 解析(思維.DFS.DP.重心) 今天我們來看看CF685B 題目連結 題目 給你一棵樹,要求你求出每棵子樹的重心. 前言 完全不 ...

  2. D. New Year Santa Network 解析(思維、DFS、組合、樹狀DP)

    Codeforce 500 D. New Year Santa Network 解析(思維.DFS.組合.樹狀DP) 今天我們來看看CF500D 題目連結 題目 給你一棵有邊權的樹,求現在隨機取\(3 ...

  3. B. Two Fairs 解析(思維、DFS、組合)

    Codeforce 1276 B. Two Fairs 解析(思維.DFS.組合) 今天我們來看看CF1276B 題目連結 題目 給一個連通圖,並給兩個點(\(a,b\)),求有多少點對使得:任一路徑 ...

  4. D. Maximum Distributed Tree 解析(思維、DFS、組合、貪心、DP)

    Codeforce 1401 D. Maximum Distributed Tree 解析(思維.DFS.組合.貪心.DP) 今天我們來看看CF1401D 題目連結 題目 直接看原題比較清楚,略. 前 ...

  5. DFT、DTFT、DFS、FFT之间的关系

    DFT.DTFT.DFS.FFT.FT.FS之间的关系 FT和FS是研究连续信号的,在数字信号处理中不涉及. 主要是前四种的关系: DFT(Discrete Fourier Transform):离散 ...

  6. 图、dfs、bfs

    graphdfsbfs 1.clone graph2.copy list with random pointer3.topological sorting4.permutations5.subsets ...

  7. 搜索(BFS、DFS、回溯)

    这类题是最简单的了都是一个套路,不像动态规划一类题一个套路,没做过就是不会也极难想出来. 一.BFS 解决的问题:用来初始点解决到指定点的最短路径问题,因为图的每一层上的点到初始点的距离相同.(注意是 ...

  8. BFS、DFS、先序、中序、后序遍历的非递归算法(java)

    一 广度优先遍历(BFS) //广度优先遍历二叉树,借助队列,queue public static void bfs(TreeNode root){ Queue<TreeNode> qu ...

  9. 九度OJ 1091:棋盘游戏 (DP、BFS、DFS、剪枝)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1497 解决:406 题目描述: 有一个6*6的棋盘,每个棋盘上都有一个数值,现在又一个起始位置和终止位置,请找出一个从起始位置到终止位置代 ...

随机推荐

  1. Java后端开发规范

    基于阿里巴巴JAVA开发规范整理 一.命名风格 [强制]类名使用 UpperCamelCase 风格,必须遵从驼峰形式,但以下情形例外:DO / BO / DTO / VO / AO 正例:Marco ...

  2. LeetCode 41. 缺失的第一个正数(First Missing Positive)

    题目描述 给定一个未排序的整数数组,找出其中没有出现的最小的正整数. 示例 1: 输入: [1,2,0] 输出: 3 示例 2: 输入: [3,4,-1,1] 输出: 2 示例 3: 输入: [7,8 ...

  3. usage memcache in linux

    set和add的区别 set可以重写存在的键值对, 也可以添加新的/ 而add不行, 如果存在已有的键名, 则add不会做更新该键值对, 不做任何事, 就是一次无效操作, 也就是, add可以防止重写 ...

  4. rally task配置文件

    rally task配置文件 Rally本身提供了一些task配置文件,用于提供测试用例中所需的信息包括场景测试中所传入的参数.运行方式是并行还是串行,context等信息.Rally本身提供的tas ...

  5. java基础内存基础详解

    堆区: 1.存储的全部是对象,每个对象都包含一个与之对应的class的信息.(class的目的是得到操作指令) 2.jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对 ...

  6. 关于JavaWeb面试

    什么是JavaWeb? Java web  是指有Java语言开发出来可以在万维网上访问浏览的程序. Java Web,是用Java技术来解决相关web互联网领域的技术总和.web包括:web服务器和 ...

  7. SSM批量添加数据

    如何应对面临批量数据时如何提交给后台 方式1: 使用JSON格式 后台功能接受实现使用@ResponseBody 前端当有多行数据的时候添加到一个数组再通过JSON格式到后台List接收 @Reque ...

  8. go http server 编程

    第一种:最简单的 package main import ( "fmt" "log" "net/http" ) func myHandler ...

  9. tf.metrics.sparse_average_precision_at_k 和 tf.metrics.precision_at_k的自己理解

    tensorflow最大的问题就是大家都讲算法,不讲解用法,API文档又全是英文的,看起来好吃力,理解又不到位.当然给数学博士看的话,就没问题的. 最近看了一系列非常不错的文章,做一下记录: http ...

  10. VMware 虚拟机安装Mac OS X 10.10

    有图有真相,哈哈 一.下载以上文件 1. vm百度软件下载即可,版本都能满足需要,随意好了 2. unlocker 207 3. Mac OS X 10.10镜像 二.基本步骤 1. 虚拟机的安装 下 ...