c++

简洁


/*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 ...
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值