using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using JNPF.Common.Contracts;
using NPOI.SS.Formula.Functions;
using Tnb.WarehouseMgr.Entities;
namespace Tnb.WarehouseMgr
{
///
/// 迪杰斯特拉(最短路径算法)
///
//public class Dijkstra where T : BaseEntity, IWmsRoadEntity, new()
//{
// public static int MAX = int.MaxValue;
// public int mEdgNum; // 边的数量
// public VNode[] mVexs; // 顶点数组
// //private EData[] edges; //边的数组
// /*
// * 创建图
// *
// * 参数说明:
// * vexs -- 顶点数组
// * edges -- 边
// */
// public Dijkstra(string[] vexs, EData[] edges)
// {
// // 初始化"顶点数"和"边数"
// int vlen = vexs.Length;
// int elen = edges.Length;
// // 初始化"顶点"
// mVexs = new VNode[vlen];
// for (int i = 0; i < mVexs.Length; i++)
// {
// mVexs[i] = new VNode();
// mVexs[i].data = vexs[i];
// mVexs[i].firstEdge = null;
// }
// // 初始化"边"
// mEdgNum = elen;
// for (int i = 0; i < elen; i++)
// {
// // 读取边的起始顶点和结束顶点
// string c1 = edges[i].start;
// string c2 = edges[i].end;
// int weight = edges[i].weight;
// // 读取边的起始顶点和结束顶点
// int p1 = GetPosition(c1);
// int p2 = GetPosition(c2);
// // 初始化node1
// ENode node1 = new ENode();
// node1.ivex = p2;
// node1.weight = weight;
// // 将node1链接到"p1所在链表的末尾"
// if (mVexs[p1].firstEdge == null)
// mVexs[p1].firstEdge = node1;
// else
// LinkLast(mVexs[p1].firstEdge, node1);
// // 初始化node2
// ENode node2 = new ENode();
// node2.ivex = p1;
// node2.weight = weight;
// // 将node2链接到"p2所在链表的末尾"
// if (mVexs[p2].firstEdge == null)
// mVexs[p2].firstEdge = node2;
// else
// LinkLast(mVexs[p2].firstEdge, node2);
// }
// }
// /*
// * 将node节点链接到list的最后
// */
// private void LinkLast(ENode list, ENode node)
// {
// ENode p = list;
// while (p.nextEdge != null)
// p = p.nextEdge;
// p.nextEdge = node;
// }
// /*
// * 返回ch位置
// */
// private int GetPosition(string ch)
// {
// for (int i = 0; i < mVexs.Length; i++)
// if (mVexs[i].data == ch)
// return i;
// return -1;
// }
// /*
// * 获取边的权值;若start和end不是连通的,则返回无穷大。
// */
// private int GetWeight(int start, int end)
// {
// if (start == end)
// return 0;
// ENode node = mVexs[start].firstEdge;
// while (node != null)
// {
// if (end == node.ivex)
// return node.weight;
// node = node.nextEdge;
// }
// return MAX;
// }
// /*
// * Dijkstra最短路径。
// * 即,统计图中"起点D"到其它各个顶点的最短路径。
// *
// * 参数说明:
// * vs -- 起始顶点(start vertex)。
// * prev -- 前驱顶点数组。即,prev[i]的值是"起点D"到"顶点i"的最短路径所经历的全部顶点中,位于"顶点i"之前的那个顶点。
// * dist -- 长度数组。即,dist[i]是"起点D"到"顶点i"的最短路径的长度。
// */
// public void CalcDijkstra(int vs, int[] prev, int[] dist, List roads)
// {
// //List vertexs = new(); //最短路径串联的点位列表
// // flag[i]=true表示"起点D"到"顶点i"的最短路径已成功获取。
// bool[] flag = new bool[mVexs.Length];
// // 初始化
// for (int i = 0; i < mVexs.Length; i++)
// {
// flag[i] = false; // 顶点i的最短路径还没获取到。
// prev[i] = 0; // 顶点i的前驱顶点为0。
// dist[i] = GetWeight(vs, i); // 顶点i的最短路径为"起点D"到"顶点i"的权。
// }
// // 对"起点D"自身进行初始化
// flag[vs] = true;
// dist[vs] = 0;
// // 遍历mVexs.Length-1次;每次找出一个顶点的最短路径。
// int k = 0;
// for (int i = 1; i < mVexs.Length; i++)
// {
// // 寻找当前最小的路径
// // 即,在未获取最短路径的顶点中,找到离起点D最近的顶点(k)。
// int min = MAX;
// for (int j = 0; j < mVexs.Length; j++)
// {
// if (flag[j] == false && dist[j] < min)
// {
// min = dist[j];
// k = j;
// }
// }
// // 标记"顶点k"为已经获取到最短路径
// flag[k] = true;
// // 更新当前最短路径和前驱顶点
// // 即,更新"未获取最短路径的顶点的最短路径和前驱顶点"。
// for (int j = 0; j < mVexs.Length; j++)
// {
// int tmp = GetWeight(k, j);
// tmp = (tmp == MAX ? MAX : (min + tmp)); // 防止溢出
// if (flag[j] == false && (tmp < dist[j]))
// {
// dist[j] = tmp;
// prev[j] = k;
// }
// }
// }
// }
//}
/////
///// 邻接表中表对应的链表的顶点
/////
//public class ENode
//{
// public int ivex; // 该边所指向的顶点的位置
// public int weight; // 该边的权
// public ENode nextEdge; // 指向下一条弧的指针
//}
/////
///// 邻接表中表的顶点
/////
//public class VNode
//{
// public string data; // 顶点信息
// public ENode firstEdge; // 指向第一条依附该顶点的弧
//}
/////
///// 边的结构体
/////
//public class EData
//{
// public string start; // 边的起点
// public string end; // 边的终点
// public int weight; // 边的权重
// public EData(string start, string end, int weight)
// {
// this.start = start;
// this.end = end;
// this.weight = weight;
// }
//}
}