图和图算法-
- 图和图算法-边的集合和定点的集合组成;
- 顶点有权重-成本; 顶点有序-向图;
- 图是无序的-无序图或无向图;
- 一个节点到另一个节点-路径;
- 指向本身顶点路径-环;
- 至少有一条路径-圈;
- 圈中无重复顶点-简单圈;
- 有重复顶点-平凡圈;
- 两个顶点之间有路径-强连通;
- 深度优先搜索,广度优先搜索;
function Graph(v) {
this.vertices = v
this.edges = 0
this.adj = []
this.marked = []
// 创建二维数组
for (var i = 0
this.adj[i] = []
this.marked[i] = false
}
this.addEdge = addEdge
this.showGraph = showGraph
this.dfs = dfs
this.bfs = bfs
this.edgeTo = []
this.hasPathTo = hasPathTo
this.pathTo = pathTo
}
function addEdge(v, w) {
this.adj[v].push(w)
this.adj[w].push(v)
this.edges++
}
function showGraph() {
for (var i = 0
var edges = ""
for (var j = 0
if (this.adj[i][j]) {
edges += this.adj[i][j] + " "
}
}
console.log(i + "->" + edges)
}
}
function dfs(v) {
this.marked[v] = true
if (this.adj[v] != undefined) {
console.log(v + "【节点已经被访问】")
}
for (const w in this.adj[v]) {
var current = this.adj[v][w]
if (!this.marked[current]) {
this.dfs(current)
}
}
}
function bfs(s) {
var queue = []
this.marked[s] = true
queue.push(s)
while (queue.length > 0) {
var v = queue.shift()
if (v != undefined) {
console.log("[bfs]" + v + "【节点已被访问】")
}
for (var w in this.adj[v]) {
var current = this.adj[v][w]
if (!this.marked[current]) {
this.marked[current] = true
this.edgeTo[current] = v
queue.push(current)
}
}
}
}
function hasPathTo(v) {
return this.marked[v]
}
function pathTo(v) {
var source = 0
if (!this.hasPathTo(v)) {
return undefined
}
var path = []
for (var i = v
path.push(i)
}
path.push(source)
return path
}
var g = new Graph(5)
g.addEdge(0, 1)
g.addEdge(0, 2)
g.addEdge(1, 3)
g.addEdge(2, 4)
g.showGraph()
// g.dfs(0)
g.bfs(0)
var paths = g.pathTo(4)
var str = ""
while (paths.length > 0) {
if (paths.length > 1) {
str += paths.pop() + "->"
} else {
str += paths.pop()
}
}
console.log(str)