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. dubbo中的group与version的存在意义

    公司每周五都要给线上系统发布一个版本,我将本周新开发的业务模块直接提交到svn的主干上(当然本机已经测试通过),在公司的测试环境部署运行正常,测试人员业务测试通过.但是在部署到准生产环境上后出现了意想 ...

  2. SpringCloud-Config通过Java访问URL对敏感词加密解密

    特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...

  3. Linux设备驱动程序 之 度量时间差

    概述 内核通过定时器中断来跟踪事件流: 时钟中断由系统定时硬件以及周期性的间隔产生,这个间隔由内核根据HZ的值设定,HZ是一个细节结构有关的常数:作为一般性规则,即使知道对应平台上的确切HZ值,也不应 ...

  4. linux编辑文本(vim)时跳转到最后一行和第一行及相关指令

    vi操作 1.跳到文本的最后一行:按“G”,即“shift+g” 2.跳到最后一行的最后一个字符 : 先重复1的操作即按“G”,之后按“$”键,即“shift+4”. 3.跳到第一行的第一个字符:先按 ...

  5. 开机自动挂载ISO文件

    开机自动挂载ISO文件 Table of Contents 1. 概述 1.1. 通过fstab 1.2. 通过rc.local 1 概述 开机自动挂载ISO 文件有两种途径 .一种是通过配置fsta ...

  6. handler方法

    post(Runnable) postAtTime(Runnable,long) postDelayed(Runnable long) post类方法允许你排列一个Runnable对象到主线程队列中 ...

  7. manager 实现进程之间的数据共享 list dict

    manager 能够实现进程之间的数据共享 (list,dict) 如果多个进程同事修改同一份共享数据,这个时候需要加锁,保证数据的准确性. (1) dict list 可以实现进程之间的数据共享 ( ...

  8. Eclipse中给SVN添加项目

    SVN添加项目, 1.在svn资源库中的目标路径上右键,新建一个远程文件夹,文件夹名称和项目名称一致即可. 2,在新建的远程目录上右键,选导入,导入我们要放到svn的本地项目. 3.导入时选中项目的名 ...

  9. 小D课堂 - 新版本微服务springcloud+Docker教程_5-03 feign结合hystrix断路器开发实战上

    笔记 3.Feign结合Hystrix断路器开发实战<上>     简介:讲解SpringCloud整合断路器的使用,用户服务异常情况 1.加入依赖          注意:网上新旧版本问 ...

  10. HBase管理与监控——内存调优

    HMaster 没有处理过重的负载,并且实际的数据服务不经过 HMaster,它的主要任务有2个:一.管理Hbase Table的 DDL操作, 二.region的分配工作,任务不是很艰巨. 但是如果 ...