c##

高冷十三岁 2017-11-23 11:36:22
/*Program to find shortest path between two hot-points in the map*/

namespace Process {
public class DijkSingle {
private static int MAX_SIZE = StaticVar.NodeCount;
private Double[, ] a = new Double[MAX_SIZE + 1, MAX_SIZE + 1]; //weight pairs for each edge
static int v = 1; // index of starting hot-point
private Double[] dist = new Double[MAX_SIZE + 1]; //store the distance between starting hot-point and each other hot-point
private int[] prev = new int[MAX_SIZE + 1];

public DijkSingle(ArrayList lockedways) {
InitData(); // get the map data from db
for (int i = 0; i < lockedways.Count; i++) { // initialize distances of all vertices as infinite
string val = lockedways[i] + "";
int startPoint = int.Parse(val.Split('-')[0]);
int endPoint = int.Parse(val.Split('-')[1]);
a[startPoint, endPoint] = Double.MaxValue;
a[endPoint, startPoint] = Double.MaxValue;
}
}

private void Dijkstra(int v, Double[, ] a, Double[] dist, int[] prev) {
int n = dist.Length - 1;
if (v < 1 || v > n) return;
bool[] s = new bool[n + 1]; //set a mark to each hot-point whether it has already been visted
for (int i = 1; i <= n; i++) {
dist[i] = a[v, i];
s[i] = false;
if (dist[i] == Double.MaxValue) prev[i] = 0;
else prev[i] = v;
}

dist[v] = 0;
s[v] = true; //assum that starting hot-point has been visited
for (int i = 1; i < n; i++) {
Double temp = Double.MaxValue;
int u = v;
for (int j = 1; j <= n; j++) //get current shortest path
if ((!s[j]) && (dist[j] < temp)) {
u = j;
temp = dist[j];
}

s[u] = true;
for (int j = 1; j <= n; j++)
if ((!s[j]) && (a[u, j] < Double.MaxValue)) {
Double newdist = dist[u] + a[u, j];
if (newdist < dist[j]) {
dist[j] = newdist;
prev[j] = u;
}
}
}

}

//check the starting hot-point in the road with obstacle whether or not exist in the Vist Path
public bool isInpath(ArrayList lockedways, ArrayList visitPath) {
bool isInpath = false;
for (int i = 0; i < lockedways.Count; i++) {
string val = lockedways[i] + "";
int startPoint = int.Parse(val.Split('-')[0]);
int endPoint = int.Parse(val.Split('-')[1]);
if (visitPath.Contains(startPoint) && visitPath.Contains(endPoint)) isInpath = true;
}
return isInpath;
}

//get the shortest path between starting hot-point and ending hot-point
public ArrayList getSingleDijk(int startPoint, int endPoint) {
ArrayList res = new ArrayList();
v = startPoint;

Dijkstra(v, a, dist, prev);
res.Add(endPoint);

if (dist[endPoint] < Double.MaxValue) {
res.Add(prev[endPoint]);

while (prev[endPoint] != startPoint) {
res.Add(prev[prev[endPoint]]);
endPoint = prev[endPoint];
}
res.Reverse();

return res;
}
else return res;
}

public void InitData() {
// get the hot-points from the db
// do something ...
}
}
}
...全文
187 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
正怒月神 2017-11-29
  • 打赏
  • 举报
回复
what do you mean
m0_37748860 2017-11-29
  • 打赏
  • 举报
回复
代码没细看,顶一顶,

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧