<%@ LANGUAGE="JScript" CodePage="936"%>
<%
var COBJ = function(progid) { return Server.CreateObject(progid) };
var println = function(s) { Response.Write(Server.HTMLEncode(s+"\n").replace(/\n/g, "<br />")); };
var alert = function(s) { Response.Write("<script type='text/javascript'>alert(unescape(\"" + escape(s+"") + "\"));</script>"); };
var MAX = 999999999999;
//获取所有顶点
function getVS(conn) {
var vs = [];
vs.get = function(name) { return this[this[name]]; };
var rs = conn.Execute("SELECT DISTINCT * FROM (SELECT DISTINCT [s] FROM [map] UNION ALL SELECT DISTINCT [e] FROM [map])");
while (!rs.EOF) {
vs[rs(0).Value] = vs.length;
vs.push({name:rs(0).Value, pre:null, v:MAX});
rs.MoveNext();
}
rs.Close(); rs = null;
return vs;
}
// 初始化数据
function initVS(vs, start, OVS, CVS, conn) {
var rs = conn.Execute("SELECT * FROM [map]");
while (!rs.EOF) {
var s = vs.get(rs("s").Value);
s.to = s.to || {};
s.to[rs("e").Value] = rs("v").Value;
rs.MoveNext();
}
rs.Close(); rs = null;
var s = vs.get(start); s.v = 0;
CVS.push(s);
for (var i in s.to) {
var t = vs.get(i);
t.v = s.to[i];
t.pre = s;
}
for (var i=0; i<vs.length; i++) if (i!=vs[start]) OVS.push(vs[i]);
}
// 寻找开启列表中 F 值最低的顶点
function findMinV(OVS) {
var min = MAX;
if (OVS.length < 1) return false;
var pos = 0;
for (var i=0; i<OVS.length; i++) {
if (OVS[i].v < min) {
min = OVS[i].v
pos = i;
}
}
return OVS.splice(pos, 1)[0];
}
function find(a, b, conn) {
var OVS = []; // 开启列表
var CVS = []; // 关闭列表
var vs = getVS(conn);
initVS(vs, a, OVS, CVS, conn);
var target = findMinV(OVS);
while (target) {
for (var i in target.to) {
var t = vs.get(i);
if (t.v > target.v + target.to[i]) {
t.pre = target;
t.v = target.v + target.to[i];
}
}
CVS.push(target);
target = findMinV(OVS);
}
target = vs.get(b)
var total= target.v;
var res = target.name;
while (target.pre != null) {
res = target.pre.name + " -> " + res;
target = target.pre;
}
return "距离:" + total + "。\n路线:" + res + "。";
}
var conn = COBJ("ADODB.Connection")
conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath("test.mdb");
conn.Open();
var res = find("商城仓库", "长宁路", conn);
conn.Close();
conn = null;
alert(res);
println(res);
%>