JS演示圖論匯總

BFS.js

var BFSClass = function () {this.isVisit = new Array();this.adj = new Array();this.vQueue = new Array();this.curV;this.temp = new Array();this.init = function (beginV) {this.curV = null;this.temp = [];//初始化頂點訪問數組this.isVisit = [];for (var i = 0; i < vers.length; i++)this.isVisit.push(false);//初始化鄰接矩陣this.adj = [];for (var i = 0; i < vers.length; i++) {this.adj[i] = new Array();for (var j = 0; j < vers.length; j++)this.adj[i][j] = 0;}for (var i = 0; i < edges.length; i++) {this.adj[this.Locate(edges[i].v1)][this.Locate(edges[i].v2)] = 1;this.adj[this.Locate(edges[i].v2)][this.Locate(edges[i].v1)] = 1;}//開始頂點入隊列,修改頂點狀態this.vQueue = [];this.vQueue.push(beginV);beginV.setStatus(1);this.isVisit[this.Locate(beginV)] = true;DrawGraph();Note(BFS.msg());}this.Next = function () {if (this.vQueue.length <= 0) {alert("遍歷結束");return;}if (this.vQueue.length > 0) {this.temp = [];if (this.curV)this.curV.setStatus(1);this.curV = this.vQueue.shift();this.curV.setStatus(2);var cur = this.Locate(this.curV);for (var j = 0; j < vers.length; j++)if (this.adj[cur][j] == 1 && !this.isVisit[j]) {this.isVisit[j] = true;this.vQueue.push(vers[j]);this.temp.push(vers[j]);}if (BFS.temp.length > 0)drawLines(vers[cur], BFS.temp, function () {BFS.temp[0].setStatus(1);edges[BFS.LocateEg(vers[cur], BFS.temp[0])].setStatus(1);DrawGraph();}, function () {document.getElementById('NextBtn').disabled = false;});else {document.getElementById('NextBtn').disabled = false;}DrawGraph();Note(BFS.msg());}}this.Locate = function (v) {for (var i = 0; i < vers.length; i++)if (vers[i] == v)return i;return -1;}this.LocateEg = function (v1, v2) {for (var i = 0; i < edges.length; i++)if ((edges[i].v1 == v1 && edges[i].v2 == v2) || (edges[i].v1 == v2 && edges[i].v2 == v1))return i;return -1;}this.msg = function () {var s = " 當前頂點:" + BFS.curV.name + ".  隊列內元素:";for (var i = 0; i < BFS.vQueue.length; i++)s += BFS.vQueue[i].name + " ";return s;}
}
var BFS = new BFSClass();

DFS.js

var DFSClass = function () {this.isVisit = new Array();this.adj = new Array();this.vstack = new Array();this.curV;this.init = function (beginV) {//初始化頂點訪問數組this.isVisit = [];for (var i = 0; i < vers.length; i++)this.isVisit.push(false);//初始化鄰接矩陣this.adj = [];for (var i = 0; i < vers.length; i++) {this.adj[i] = new Array();for (var j = 0; j < vers.length; j++)this.adj[i][j] = 0;}for (var i = 0; i < edges.length; i++) {this.adj[this.Locate(edges[i].v1)][this.Locate(edges[i].v2)] = 1;this.adj[this.Locate(edges[i].v2)][this.Locate(edges[i].v1)] = 1;}//開始頂點入棧,修改頂點狀態this.vstack = [];this.vstack.push(beginV);this.isVisit[this.Locate(beginV)] = true;this.curV = beginV;beginV.setStatus(2);DrawGraph();Note(DFS.msg());}this.Next = function () {if (this.vstack.length <= 0) {alert("遍歷結束");document.getElementById('NextBtn').disabled = false;return;}var cur = this.Locate(this.curV);for (var j = 0; j < vers.length; j++)if (this.adj[cur][j] == 1 && !this.isVisit[j]) {this.isVisit[j] = true;this.curV = vers[j];this.vstack.push(this.curV);drawLine(vers[cur], vers[j], function () {vers[cur].setStatus(1);vers[j].setStatus(2);edges[DFS.LocateEg(vers[cur], vers[j])].setStatus(1);DrawGraph();Note(DFS.msg());document.getElementById('NextBtn').disabled = false;});return;}this.curV = this.vstack.pop();if (this.vstack.length > 0) {drawLine(DFS.curV, DFS.vstack[DFS.vstack.length - 1], function () {DFS.curV.setStatus(1);DFS.curV = DFS.vstack[DFS.vstack.length - 1];DFS.curV.setStatus(2);DrawGraph();Note(DFS.msg());document.getElementById('NextBtn').disabled = false;});}else {this.curV.setStatus(1);DrawGraph();Note(DFS.msg());document.getElementById('NextBtn').disabled = false;}}this.Locate = function (v) {for (var i = 0; i < vers.length; i++)if (vers[i] == v)return i;return -1;}this.LocateEg = function (v1, v2) {for (var i = 0; i < edges.length; i++)if ((edges[i].v1 == v1 && edges[i].v2 == v2) || (edges[i].v1 == v2 && edges[i].v2 == v1))return i;return -1;}this.msg = function () {var s = " 當前頂點:" + DFS.curV.name + ".  棧內元素:";for (var i = 0; i < DFS.vstack.length; i++)s += DFS.vstack[i].name + " ";return s;}
}
var DFS = new DFSClass();

kruskal.js

var KruskalClass = function () {var eg;var edgeCount;this.flag = new Array();this.sortEdge = new Array();this.adj = new Array();this.init = function () {this.eg = null;this.edgeCount = 0;//初始化連通分量數組this.flag = [];for (var i = 0; i < vers.length; i++)this.flag.push(i);//初始化鄰接矩陣this.adj = [];for (var i = 0; i < vers.length; i++) {this.adj[i] = new Array();for (var j = 0; j < vers.length; j++)this.adj[i][j] = Infinity;}for (var i = 0; i < edges.length; i++) {this.adj[this.Locate(edges[i].v1)][this.Locate(edges[i].v2)] = edges[i].weight;this.adj[this.Locate(edges[i].v2)][this.Locate(edges[i].v1)] = edges[i].weight;}//邊排序this.sortEdge = [];for (var i = 0; i < edges.length; i++)this.sortEdge.push(edges[i]);this.sortEdge.sort(this.sortNumber);Note(this.msg());}this.Next = function () {if (Number(Kruskal.edgeCount) >= vers.length - 1) {alert("求解結束");return;}while (this.flag[this.Locate(this.sortEdge[0].v1)] == this.flag[this.Locate(this.sortEdge[0].v2)])this.sortEdge.shift();this.eg = this.sortEdge[0];blink(this.eg, function () {Kruskal.eg.setStatus(1);Kruskal.eg.v1.setStatus(1);Kruskal.eg.v2.setStatus(1);var v1Num = Kruskal.flag[Kruskal.Locate(Kruskal.eg.v1)];var v2Num = Kruskal.flag[Kruskal.Locate(Kruskal.eg.v2)];for (var i = 0; i < Kruskal.flag.length; i++)if (Kruskal.flag[i] == v1Num)Kruskal.flag[i] = v2Num;Kruskal.sortEdge.shift();DrawGraph();Kruskal.edgeCount++;document.getElementById('NextBtn').disabled = false;Note(Kruskal.msg(Kruskal.eg));});}this.Locate = function (v) {for (var i = 0; i < vers.length; i++)if (vers[i] == v)return i;return -1;}this.LocateEg = function (v1, v2) {for (var i = 0; i < edges.length; i++)if ((edges[i].v1 == v1 && edges[i].v2 == v2) || (edges[i].v1 == v2 && edges[i].v2 == v1))return i;return -1;}this.msg = function (e) {var s = "本次加入邊:" + e.v1.name + e.v2.name;return s;}this.sortNumber = function (a, b) {return a.weight - b.weight;}}
var Kruskal = new KruskalClass();

prim.js

var PrimClass = function () {var eg, trueV, falseV;this.flag = new Array();this.tree = new Array();this.adj = new Array();this.init = function (beginV) {this.eg = null;this.trueV = null;this.falseV = null;this.tree = [];//初始化頂點訪問數組this.flag = [];for (var i = 0; i < vers.length; i++)this.flag.push(false);//初始化鄰接矩陣this.adj = [];for (var i = 0; i < vers.length; i++) {this.adj[i] = new Array();for (var j = 0; j < vers.length; j++)this.adj[i][j] = Infinity;}for (var i = 0; i < edges.length; i++) {this.adj[this.Locate(edges[i].v1)][this.Locate(edges[i].v2)] = edges[i].weight;this.adj[this.Locate(edges[i].v2)][this.Locate(edges[i].v1)] = edges[i].weight;}//設置頂點和邊的狀態this.flag[this.Locate(beginV)] = true;beginV.setStatus(1);this.setEdges();DrawGraph();Note(Prim.msg(beginV));}this.Next = function () {if (this.tree.length >= vers.length - 1) {alert("求解結束");return;}this.eg = this.getMinEdge();if (this.flag[this.Locate(edges[this.eg].v1)]) {this.trueV = edges[this.eg].v1; this.falseV = edges[this.eg].v2;}else {this.trueV = edges[this.eg].v2; this.falseV = edges[this.eg].v1;}drawLine(this.trueV, this.falseV, function () {Prim.flag[Prim.Locate(Prim.falseV)] = true;Prim.falseV.setStatus(1);Prim.tree.push(edges[Prim.eg]);Prim.setEdges();DrawGraph();document.getElementById('NextBtn').disabled = false;Note(Prim.msg(Prim.falseV));});}this.Locate = function (v) {for (var i = 0; i < vers.length; i++)if (vers[i] == v)return i;return -1;}this.LocateEg = function (v1, v2) {for (var i = 0; i < edges.length; i++)if ((edges[i].v1 == v1 && edges[i].v2 == v2) || (edges[i].v1 == v2 && edges[i].v2 == v1))return i;return -1;}this.msg = function (v) {var s = " 本次加入生成樹的頂點為:" + v.name;return s;}this.setEdges = function () {for (var i = 0; i < edges.length; i++) {if (this.flag[this.Locate(edges[i].v1)] != this.flag[this.Locate(edges[i].v2)])edges[i].setStatus(2);elseedges[i].setStatus(0);}for (var i = 0; i < this.tree.length; i++)this.tree[i].setStatus(1);}this.getMinEdge = function () {var minWeight = Infinity, minPosition = -1;for (var i = 0; i < edges.length; i++) {if (this.flag[this.Locate(edges[i].v1)] != this.flag[this.Locate(edges[i].v2)] && edges[i].weight < minWeight) {minWeight = edges[i].weight;minPosition = i;}}return minPosition;}
}
var Prim = new PrimClass();

JS.js

//半徑
var r = 10;
//鼠標狀態
var mStatus = 3;
//畫邊時的第一個點
var selectV = null;
//頂點數組
var vers = new Array();
//邊數組
var edges = new Array();
//鄰接矩陣
var adj = new Array();
//遍歷棧、隊列
var vstack = new Array();
//接收canvas的onclick事件
function CanvasClick(e) {e = e || event;var canvas = document.getElementById('MyCanvas');var x = e.clientX - canvas.offsetLeft;var y = e.clientY - canvas.offsetTop;switch (mStatus){case 0:AddV(x, y);break;case 1:Select(x, y);break;case 2:AddE(x,y);break;default:break;}}
//添加頂點
function AddV(x, y) {//檢查坐標是否符合添加頂點的要求if (CheckPoint(x, y)) {var v = new vertex(x, y);vers.push(v);DrawGraph();Output(" * 添加頂點:" + v.name + "。位置:" + v.x + "," + v.y + "<br/>");}
}
//選擇頂點
function Select(x, y) {for (var i = 0; i < vers.length; i++)if (Math.sqrt((vers[i].x - x) * (vers[i].x - x) + (vers[i].y - y) * (vers[i].y - y)) <= 10) {selectV = vers[i];selectV.isSelect = true;DrawGraph();mStatus = 2;Output("<font color='red'>" + " * 選中頂點:" + selectV.name + "</font><br/>");var canvas = document.getElementById('MyCanvas');canvas.style.cursor = 'url(畫邊.png),auto';}
}
//添加邊
function AddE(x, y) {for (var i = 0; i < vers.length; i++)if (Math.sqrt((vers[i].x - x) * (vers[i].x - x) + (vers[i].y - y) * (vers[i].y - y)) <= 10) {var eg = new edge(selectV, vers[i]);edges.push(eg);selectV.isSelect = false;DrawGraph();mStatus = 1;var canvas = document.getElementById('MyCanvas');canvas.style.cursor = 'url(選點.png),auto';Output("<font color='blue'>" + " * 添加邊:" + eg.v1.name + eg.v2.name + "</font><br/>");}
}
//信息輸出
function Output(msg) {var outputDiv = document.getElementById('OutputDiv');outputDiv.innerHTML += msg;
}
//畫頂點前檢查坐標是否符合要求
function CheckPoint(x, y) {if (x < 30 || x > 650 || y < 30 || y > 350)return false;for (var i = 0; i < vers.length; i++) {if (Math.sqrt((vers[i].x - x) * (vers[i].x - x) + (vers[i].y - y) * (vers[i].y - y)) < 60)return false;}return true;
}//畫點事件
function AddVBtnClick() {mStatus = 0;var canvas = document.getElementById('MyCanvas');canvas.style.cursor = 'url(畫點.png),auto';
}
//畫邊事件
function AddEBtnClick() {if (selectV) {selectV.isSelect = false;var n = selectV.name;selectV = null;DrawGraph();Output("<font color='red'>" + " * 取消頂點:" + n + "</font><br/>");}else {mStatus = 1;var canvas = document.getElementById('MyCanvas');canvas.style.cursor = 'url(選點.png),auto';}
}
//繪圖
function DrawGraph() {var canvas = document.getElementById('MyCanvas');canvas.width = canvas.width;if (canvas.getContext) {var ctx = canvas.getContext('2d');for (var i = 0; i < vers.length; i++)vers[i].draw(ctx);for (var i = 0; i < edges.length; i++) {edges[i].draw(ctx);}}
}
//頂點構造函數
var vertex = function (x, y) {this.x = x;this.y = y;this.name = String.fromCharCode(0x41 + vers.length);this.isSelect = false;this.isVisit = false;this.draw = function (ctx) {ctx.save();ctx.beginPath();ctx.strokeStyle = "#000000";ctx.arc(this.x, this.y, r, 2 * Math.PI, 0, true);ctx.closePath();ctx.stroke();if (this.isVisit) {ctx.fillStyle = "#00FF00";ctx.fill();}if (this.isSelect) {ctx.fillStyle = "#FFFF00";ctx.fill();}ctx.fillStyle = "#FF0000";ctx.fillText(this.name, parseInt(this.x) - 3, parseInt(this.y) + 3);ctx.restore();}
}
//邊構造函數
var edge = function (v1, v2) {this.v1 = v1;this.v2 = v2;this.isVisit = false;this.draw = function (ctx) {var x1 = parseInt(v1.x), y1 = parseInt(v1.y), x2 = parseInt(v2.x), y2 = parseInt(v2.y);var a = x1 - x2, b = y1 - y2, c = Math.sqrt(a * a + b * b);var beginX = x1 - a * r / c, beginY = y1 - b * r / c;var endX = x2 + a * r / c, endY = y2 + b * r / c;ctx.save();ctx.beginPath();if (this.isVisit)ctx.strokeStyle = "#FF0000";elsectx.strokeStyle = "#000000";ctx.moveTo(beginX, beginY);ctx.lineTo(endX, endY);ctx.stroke();ctx.closePath();ctx.restore();}
}function loadXmlFile(xmlFile) {var xmlDom = null;if (window.ActiveXObject) {xmlDom = new ActiveXObject("Microsoft.XMLDOM");xmlDom.async = false;xmlDom.load(xmlFile) || xmlDom.loadXML(xmlFile); //如果用的是XML字符串//如果用的是xml文件  }else if (document.implementation && document.implementation.createDocument) {var xmlhttp = new window.XMLHttpRequest();xmlhttp.open("GET", xmlFile, false);xmlhttp.send(null);xmlDom = xmlhttp.responseXML;} else {xmlDom = null;}return xmlDom;
}function DrawBtnClick() {var canvas = document.getElementById('MyCanvas');canvas.width = canvas.width;vers = [];edges = [];var ctrlDiv = document.getElementById('CtrlDiv');CtrlDiv.innerHTML = "<input id=\"AddVBtn\" type=\"button\" value=\"畫點\" onclick=\"AddVBtnClick();\" />";CtrlDiv.innerHTML += "<input id=\"AddEBtn\" type=\"button\" value=\"畫邊\" onclick=\"AddEBtnClick();\" />";
}
//清空
function ClearBtnClick() {var canvas = document.getElementById('MyCanvas');canvas.width = canvas.width;vers = [];edges = [];var ctrlDiv = document.getElementById('CtrlDiv');CtrlDiv.innerHTML = "";
}
//保存
function SaveBtnClick() {var verStr="";for (var i = 0; i < vers.length; i++) {verStr += vers[i].x + "," + vers[i].y + "," + vers[i].name;if (i != vers.length-1)verStr += ".";}var egStr="";for (var i = 0; i < edges.length; i++) {egStr += edges[i].v1.name + "," + edges[i].v2.name;if (i != edges.length-1)egStr += ".";}document.getElementById("HiddenField").value = verStr + "|" + egStr;
}
//載入
function LoadBtnClick() {var xmlDoc = loadXmlFile("XMLFile.xml");var k = xmlDoc.getElementsByTagName("Graph").length;var s = "<select id=\"GraphSelect\">";for (var i = 0; i < k; i++) {s+="<option>"+xmlDoc.getElementsByTagName("Graph")[i].getAttribute('name')+"</option>";}s += "</select>";s += "<input id=\"SubmitBtn\" type=\"button\" value=\"提交\" onclick=\"SubmitBtnClick();\" />";var ctrlDiv = document.getElementById('CtrlDiv');CtrlDiv.innerHTML = s;
}
function SubmitBtnClick() {var gname=document.getElementById('GraphSelect').value;var xmlDoc = loadXmlFile("XMLFile.xml");var count = xmlDoc.getElementsByTagName("Graph").length;var vNode, eNode;for (var i = 0; i < count; i++) if (xmlDoc.getElementsByTagName("Graph")[i].getAttribute('name') == gname) {vNode = xmlDoc.getElementsByTagName("Graph")[i].getElementsByTagName("vertexs")[0];eNode = xmlDoc.getElementsByTagName("Graph")[i].getElementsByTagName("edges")[0];break;}vers = [];for (var j = 0; j < vNode.getElementsByTagName("v").length; j++) {var x = vNode.getElementsByTagName("v")[j].getAttribute('x');var y = vNode.getElementsByTagName("v")[j].getAttribute('y');var name = vNode.getElementsByTagName("v")[j].getAttribute('name');var v = new vertex(x, y);v.name = name;vers.push(v);}edges = [];for (var j = 0; j < eNode.getElementsByTagName("eg").length; j++) {var v1,v2;for (var k = 0; k < vers.length; k++) {if (eNode.getElementsByTagName("eg")[j].getAttribute('v1') == vers[k].name)v1 = vers[k];if (eNode.getElementsByTagName("eg")[j].getAttribute('v2') == vers[k].name)v2=vers[k];}var eg = new edge(v1, v2);edges.push(eg);}DrawGraph();
}
//輸出vstack內元素
function OutVstack() {for (var i = 0; i < vstack.length; i++) {Output(vstack[i].name+" ");}Output("<br/>");
}
//DFS遍歷演示
function ShowDFSBtnClick() {if (vers.length <= 0)return;var s = "<select id=\"VertexSelect\">";for (var i = 0; i < vers.length; i++) {s += "<option>" + vers[i].name + "</option>";}s += "</select>";s += "<input id=\"BeginDFSBtn\" type=\"button\" value=\"開始\" onclick=\"BeginDFSBtnClick();\" />";s += "<input id=\"NextDFSBtn\" type=\"button\" value=\"下一步\" onclick=\"NextDFSBtnClick();\" />";var ctrlDiv = document.getElementById('CtrlDiv');CtrlDiv.innerHTML = s;
}
function Locate(v) {for (var i = 0; i < vers.length; i++)if (vers[i] == v)return i;return -1;
}
function LocateEg(v1, v2) {for (var i = 0; i < edges.length; i++)if ((edges[i].v1 == v1 && edges[i].v2 == v2)||(edges[i].v1 == v2 && edges[i].v2 == v1))return i;return -1;
}
function BeginDFSBtnClick() {var outputDiv = document.getElementById('OutputDiv');outputDiv.innerHTML = "";//初始化鄰接矩陣,棧adj = [];for (var i = 0; i < vers.length; i++) {adj[i] = new Array();for (var j = 0; j < vers.length; j++)adj[i][j] = 0;}for (var i = 0; i < edges.length; i++) {adj[Locate(edges[i].v1)][Locate(edges[i].v2)] = 1;adj[Locate(edges[i].v2)][Locate(edges[i].v1)] = 1;}vstack = [];//獲取開始頂點var vname = document.getElementById('VertexSelect').value;//開始頂點入棧,修改頂點狀態,重繪圖for (var i = 0; i < vers.length; i++)if (vers[i].name == vname) {vstack.push(vers[i]);vers[i].isVisit = true;vers[i].isSelect = true;Output(" * 訪問頂點" + vers[i].name + "<br/>");Output(" * 頂點" + vers[i].name + "入棧,當前頂點為:" + vers[i].name + "<br/>");}DrawGraph();
}
function NextDFSBtnClick() {if (vstack.length <= 0) {alert("遍歷結束");Output("<br/> * 遍歷結束<br/>");return;}var cur = Locate(vstack[vstack.length - 1]);for (var j = 0; j < vers.length; j++)if (adj[cur][j] == 1 && !vers[j].isVisit) {vers[j].isVisit = true;vers[j].isSelect = true;vers[cur].isSelect = false;vstack.push(vers[j]);edges[LocateEg(vers[cur], vers[j])].isVisit = true;DrawGraph();Output(" * 通過頂點" + vers[cur].name + "訪問頂點" + vers[j].name +  ",");Output("頂點" + vers[cur].name + "入棧,當前頂點為:" + vers[j].name + "<br/>");return;}vers[cur].isSelect = false;Output(" * 將頂點" + vers[cur].name + "出棧");vstack.pop();if (vstack.length > 0) {vstack[vstack.length - 1].isSelect = true;Output(",當前頂點為:" + vstack[vstack.length - 1].name + "<br/>");}DrawGraph();
}//BFS遍歷演示
function ShowBFSBtnClick() {if (vers.length <= 0)return;var s = "<select id=\"VertexSelect\">";for (var i = 0; i < vers.length; i++) {s += "<option>" + vers[i].name + "</option>";}s += "</select>";s += "<input id=\"BeginBFSBtn\" type=\"button\" value=\"開始\" onclick=\"BeginBFSBtnClick();\" />";s += "<input id=\"NextBFSBtn\" type=\"button\" value=\"下一步\" onclick=\"NextBFSBtnClick();\" />";var ctrlDiv = document.getElementById('CtrlDiv');CtrlDiv.innerHTML = s;
}
function BeginBFSBtnClick() {var outputDiv = document.getElementById('OutputDiv');outputDiv.innerHTML = "";//初始化鄰接矩陣,隊列adj = [];for (var i = 0; i < vers.length; i++) {adj[i] = new Array();for (var j = 0; j < vers.length; j++)adj[i][j] = 0;}for (var i = 0; i < edges.length; i++) {adj[Locate(edges[i].v1)][Locate(edges[i].v2)] = 1;adj[Locate(edges[i].v2)][Locate(edges[i].v1)] = 1;}vstack = [];//獲取開始頂點var vname = document.getElementById('VertexSelect').value;//開始頂點入隊列,修改頂點狀態,重繪圖for (var i = 0; i < vers.length; i++)if (vers[i].name == vname) {vstack.push(vers[i]);vers[i].isVisit = true;vers[i].isSelect = true;Output(" * 訪問頂點" + vers[i].name + "<br/>");Output(" * 頂點" + vers[i].name + "入隊<br/>");Output("隊列內元素:");OutVstack();Output("<font color='red'>  * 當前頂點為:" + vers[i].name + "</font><br/>");}DrawGraph();
}
function NextBFSBtnClick() {if (vstack.length <= 0) {alert("遍歷結束");Output("<br/> * 遍歷結束<br/>");return;}var cur = Locate(vstack[0]);for (var j = 0; j < vers.length; j++)if (adj[cur][j] == 1 && !vers[j].isVisit) {vers[j].isVisit = true;vstack.push(vers[j]);Output(" * 訪問頂點" + vers[j].name + "并入隊<br/>");edges[LocateEg(vers[cur], vers[j])].isVisit = true;}vstack.shift();vers[cur].isSelect = false;if (vstack.length <= 0) {alert("遍歷結束");Output("<br/> * 遍歷結束<br/>");DrawGraph();return;}vstack[0].isSelect = true;DrawGraph();Output("隊列內元素:");OutVstack();Output("<font color='red'> * 當前頂點為:" + vstack[0].name + "</font><br/>");
}function DelBtnClick() {var canvas = document.getElementById('MyCanvas');canvas.style.cursor = 'url(刪除.png),auto';
}

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/444622.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/444622.shtml
英文地址,請注明出處:http://en.pswp.cn/news/444622.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Shell腳本自動監控docker容器的狀態

首先我們來寫一個腳本rootserver:~# cat docker_monitor.sh #!/bin/bash #監控容器的運行狀態 #容器名稱 傳入參數 containerName$1 #當前時間 nowdate "%Y-%m-%d %H:%M:%S"# 查看進程是否存在 existdocker inspect --format {{.State.Running}} ${containerNam…

Python模塊(9)-Time,Json 簡易使用教程

Time,Json簡易使用教程1 Time1.1 獲取時間1.2 程序計時2 Json1 Time Python中內置了一些與時間處理相關的庫&#xff0c;如time、datatime和calendar庫。其中time庫是Python中處理時間的標準庫&#xff0c;是最基礎的時間處理庫&#xff0c;提供如下功能功&#xff1a; &#…

AWS的VPC使用經驗(一)

Amazon VPC 概念 Amazon VPC 是 Amazon EC2 的網絡化階層。如果您是首次使用 Amazon EC2,請參閱 Amazon EC2 用戶指南(適用于 Linux 實例) 中的什么是 Amazon EC2?以獲取簡要概述。 以下是 VPC 的主要概念: Virtual Private Cloud (VPC) 是僅適用于您的 AWS 賬戶的虛擬網…

AWS的VPC使用經驗(二)

上文說了如何創建自定義VPC網絡的EC2實例&#xff0c;這節說如何在多個VPC之間創建對等連接。 這里分別填寫自己的VPC和對方的VPC的ID信息&#xff0c;然后在對方的VPC里就能看到有連接請求&#xff0c;在對方的連接請求里選擇 “操作”->接受。 到這里已經快要收尾了&…

ML Tools List

文章目錄1.Pyorch2.TensorFlow3. Other1.Pyorch Pytorch(1)-內置/自己設計的損失函數使用 Pytorch(2)-tensor常用操作 Pytorch(3)–數據載入接口&#xff1a;Dataloader、datasets Pytorch(4)-模型保存-載入-eval() Pytorch(5)-梯度反向傳播 Pytorch(6)–設置隨機種子&am…

ubuntu nginx配置負載均衡篇(一)

Nginx 代理服務的配置說明 1、設置 404 頁面導向地址 error_page 404 https://www.runnob.com; #錯誤頁 proxy_intercept_errors on; #如果被代理服務器返回的狀態碼為400或者大于400,設置的error_page配置起作用。默認為off。 2、如果我們的代理只允許接受get,post請求…

坦克大戰

效果 map.js var map4 [[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],[0,2,2,0,0,2,2,0,0,0,2,2,0,0,2,2,0,0,2,2,0,2,2,0],[0,2,2,0,0,2,2,0,0,0,2,2,3,3,2,2…

ubuntu nginx配置負載均衡篇(二)

這里提供部分我的配置文件: nginx.conf: user www-data; worker_processes auto; pid /run/nginx.pid; include /etc/nginx/modules-enabled/*.conf;events {worker_connections 768;# multi_accept on; }http {### Basic Settings##sendfile on;tcp_nopush on;tcp_nodelay…

Papar Notes List

PaperNotes(1)-Modeling the World from Internet Photo Collections PaperNotes(2)-Generative Adversarial Nets PaperNotes(3)-圖像分割-RCNN-FCN-Boxsup PaperNotes(4)-高質量圖像生成-cgan,stackgan,lapgan,cyclegan,pix2pixgan PaperNotes(5)-Conditional Generative Adv…

windows安裝 MySQL5.7服務端

1,安裝https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.30-winx64.zip mysql安裝包。 2. 自己配置my.ini [client] port=3306 [mysql] default-character-set=utf8[mysqld] character-set-server=utf8 port=3306 basedir="D:/mysql-5.7.30-winx64/" datad…

screen命令使用說明

有些程序寫的很操蛋&#xff0c;比如放到后臺執行&#xff0c;但后邊還需要再切回前臺來重新執行&#xff0c;這個時候我們選擇screen工具&#xff1a; screen -d -m -S LoginServer[6001] ./run_login_server.sh 具體的screen命令包含哪些參數&#xff0c;可以參考scree…

看這玩意復習你還會掛科?《數據結構篇》

一&#xff0e;緒論 1.何謂程序設計&#xff1f; 程序 算法 數據結構 2.數據結構的定義 是相互之間存在一種或多種特定關系的數據元素的集合 3.數據、數據元素、數據對象的概念 數據&#xff08;data&#xff09;&#xff1a;對客觀事物的符號表示&#xff0c;含義很廣&am…

Machine Learning List

機器學習&#xff1a; 每多加一個符號&#xff0c;就多加一個變量。 每次確定給定量&#xff0c;其余均可變&#xff0c;方便分析問題。 MachineLearning(1)-激活函數sigmoid、損失函數MSE、CrossEntropyLoss MachineLearning(2)-圖像分類常用數據集 MachineLearning(3)-流型 …

反編譯用unity打包的資源文件

如何反編譯破解別人家的游戲包,美術資源是維權和侵權一直杠下去的話題,如果作為商業用途,我是反對破壞原作者的創意,侵害作者的勞動果實行為。但是如果是僅僅為了學習,實驗,不妨參考我的文章,我相信你可以從我的文章里獲取如何破解通過unity打包的移動游戲美術資源。 之…

看這玩意復習你還會掛科?《網絡原理篇》

第一章 概述 計算機網絡的功能 連通性、共享 【連通性&#xff1a;是計算機網絡使上網用戶之間都可以交換信息&#xff0c;好像這些用戶的計算機都可以彼此直接連接一樣。用戶之間的距離也似乎因此而變近了。共享&#xff1a;是指資源共享&#xff0c;它的含義是多方面的&…

蘋果訂閱服務器端開發

有時候我們想做一個蘋果訂閱功能,需要在蘋果開發者后臺添加訂閱商品productid/ 訂閱需要增加一個參數: password: 秘鑰, 就可以了, 但是官方文檔說秘鑰僅僅用在自動續訂上面 大家叫后臺加個驗證,如果蘋果驗證返回21004的話(21004 你提供的共享密鑰和賬戶的共享密鑰不一致)…

Mysql服務器線上配置主從同步

我們一般在線上搭建MYSQL都會部署一套主從同步方案: 當master(主)庫的數據發生變化的時候,變化會實時的同步到slave(從)庫。 主從復制的過程: Mysql同步過程的第一部分就是master服務器記錄二進制日志。在每個事務更新數據完成之前,master在二日志記錄這些改變。MySQL將事…

nginx代理配置根據ip地址來轉發到不同的地址端口

最近我們在開發的某SLG游戲的某業務要做如下場景: 要求在全球各個區域訪問離他最近的服務器節點:用戶通過訪問域名A,在服務器端解析用戶來源,根據ip地址來源來轉發到對應的最近的服務器節點。 由于我們之前的業務一些設計很難調整,所以我將通過代碼層面來進行做轉發處理,…

看這玩意復習你還會掛科?《web開發1篇》

#第一章 Web基礎知識 Web開發基本概念 1、萬維網是一個由許多相互鏈接的超文本組成的系統&#xff0c;通過互聯網訪問。 2、web&#xff1a;worldwideweb&#xff0c;萬維網&#xff0c;簡稱web&#xff0c;www&#xff0c;通常稱為網頁。 3、web開發&#xff1a;進行網頁頁…

如何禁止掉root登錄,使用key密鑰登錄

在Linux系統下執行命令&#xff1a; ssh-keygen -t rsa cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys vim /etc/ssh/sshd_config AuthorizedKeysFile .ssh/authorized_keys RSAAuthentication yes PubkeyAuthentication yes PasswordAuthentication n…