public Dijkstra(WeightedGraph graph, int s) { this.G = graph; G.ValidateVertex(s); this.s = s; dis = new int[G.V]; Pre = new int[G.V]; for (int i = 0; i < dis.Length; i++) { dis[i] = int.MaxValue; Pre[i] = -1; } dis[0] = 0; Pre[s] = 0; visited = new bool[G.V]; while (true) { int curDis = int.MaxValue, cur = -1; //1.遍历dis数组,找到未被定下的最小的节点 for (int i = 0; i < G.V; i++) { if (!visited[i] && dis[i] < curDis) { cur = i; curDis = dis[i]; } } if (cur == -1) { break; } //2.确定过这个最小节点的最短路径 visited[cur] = true; //3.根据这个节点的最短路的大小,更新其他节点路径的长度 foreach (var item in G.GetAdj(cur)) { if (!visited[item]) { int temp = dis[cur] + G.GetWeight(cur, item); if (temp < dis[item]) { dis[item] = temp; Pre[item] = cur; } } } } }
public BellmanFord(WeightedGraph graph, int s) { this.G = graph; G.ValidateVertex(s); this.s = s; dis = new int[G.V]; Pre = new int[G.V]; for (int i = 0; i < dis.Length; i++) { dis[i] = int.MaxValue; Pre[i] = -1; } dis[0] = 0; Pre[s] = 0; //进行V-1次松弛操作 for (int j = 1; j < G.V; j++) { for (int i = 0; i < G.V; i++) { foreach (var item in G.GetAdj(i)) { if (dis[i] != int.MaxValue) { int temp = dis[i] + G.GetWeight(i, item); if (temp < dis[item]) { dis[item] = temp; Pre[item] = i; } } } } } //再进行一次松弛操作,判断是否有负权边 for (int i = 0; i < G.V; i++) { foreach (var item in G.GetAdj(i)) { if (dis[i] != int.MaxValue) { int temp = dis[i] + G.GetWeight(i, item); if (temp < dis[item]) { hasNegCycle = true; break; } } } } }
public bool isConnected(int v) { G.ValidateVertex(v); return(visited[v]); }
//public IEnumerable<int> Path(int t) //{ // List<int> re = new List<int>(); // if (!isConnected(t)) // { // return re; // } // int cur = t; // while (Pre[cur] != cur) // { // re.Add(cur); // cur = Pre[cur]; // } // re.Add(s); // re.Reverse(); // return re; //} public bool isConnected(int v, int w) { G.ValidateVertex(v); G.ValidateVertex(w); return(dis[v, w] != int.MaxValue); }
public bool isConnected(int v) { G.ValidateVertex(v); return(dis[v] != int.MaxValue); }