1
///<summary>
/// 图的顶点的定义
///</summary>
///<typeparam name="T"></typeparam>
class GraphNode<T>
{
private T data;
///<summary>
/// 图的顶点数据属性
///</summary>
public T Data
{
get { return data; }
set { data = value; }
}
public GraphNode(T v)
{
data=v;
}
}
///<summary>
2 /// 有向图
3 ///</summary>
4 ///<typeparam name="T"></typeparam>
5 class DirectNetAdjMatrix<T>:IGraph<T>
6 {
7 ///<summary>
8 /// 有向网的定点数组
9 ///</summary>
10 private GraphNode<T>[] nodes;
11 ///<summary>
12 /// 弧的数目
13 ///</summary>
14 private int numArcs;
15 ///<summary>
16 /// 邻接矩阵数组
17 ///</summary>
18 private int[,] matrix;
19
20 ///<summary>
21 /// 构造器
22 ///</summary>
23 ///<param name="n"></param>
24 public DirectNetAdjMatrix(int n)
25 {
26 nodes = new GraphNode<T>[n];
27 matrix = new int[n, n];
28 numArcs = 0;
29 }
30
31 ///<summary>
32 /// 获取/设置索引为index的顶点的信息
33 ///</summary>
34 ///<param name="index"></param>
35 ///<returns></returns>
36 public GraphNode<T> this[int index]
37 {
38 get { return nodes[index]; }
39 set { nodes[index] = value; }
40 }
41
42 ///<summary>
43 /// 弧的数目属性
44 ///</summary>
45 public int NumArcs
46 {
47 get { return numArcs; }
48 set { numArcs = value; }
49 }
50
51 ///<summary>
52 /// 获取/设置matrix[index1,index2]的值
53 ///</summary>
54 ///<param name="index1"></param>
55 ///<param name="index2"></param>
56 ///<returns></returns>
57 public int this[int index1, int index2]
58 {
59 get {return matrix[index1, index2]; }
60 set { matrix[index1, index2] = value; }
61 }
给定v1,v2两个顶点,求二点之间的最短路径
private class outmatix
{
public T Head{get;set;}
public T Tai{get;set;}
public int Cost{get;set;}
}
public outmatix[] dijkstra(T v1,T v2)
{
outmatrix[] ot=null;
}
public outmatrix Floyd(T v1,T v2)
{
}
///<summary>
/// 迪杰斯特拉算法
///</summary>
///<param name="pathMatricArr">保存从源点到某个顶点的最短路径上的顶点</param>
///<param name="shortPathArr">保存从源点到各个顶点的最短路径的长度</param>
///<param name="n">源点</param>
public void Dijkstra(ref bool[,] pathMatricArr, ref int[] shortPathArr, GraphNode<T> n)
{
int k = 0;
bool[] final = new bool[nodes.Length];
//初始化
for (int i = 0; i < nodes.Length; i++)
{
///<summary>
///保存某顶点的最短路径是否已经找到
///<summary>
final[i] = false;
///<summary>
///保存从源点到各个顶点的最短路径的长度
///<summary>
shortPathArr[i] = matrix[GetIndex(n), i];
for (int j = 0; j < nodes.Length; j++)
{
///<summary>
///保存从源点到某个顶点的最短路径上的顶点
///<summary>
pathMatricArr[i, j] = false;
}
if (shortPathArr[i] != 0 && shortPathArr[i] < int.MaxValue)
{
pathMatricArr[i, GetIndex(n)] = true;
pathMatricArr[i, i] = true;
}
}
//n为源点
shortPathArr[GetIndex(n)] = 0;
final[GetIndex(n)] = true;
//处理从源点到其余顶点的最短路径
for (int i = 0; i < nodes.Length; i++)
{
int min = int.MaxValue;
//比较从源点到其余顶点的最短路径
for (int j = 0; j < nodes.Length; j++)
{
//从源点到其余顶点的最短路径还没有找到
if (!final[j])
{
//从源点到j顶点的最短路径最小
if (shortPathArr[j] < min)
{
k = j;
min = shortPathArr[j];
}
}
}
//min = shortPathArr.Select((x, i) => new { x, i }).TakeWhile(y => !final[y.i]).Min().x;
//k = shortPathArr.Select((x, i) => new { x, i }).TakeWhile(y => !fina[y.i]).Min().i;
//从源点到顶点k的路径长度最小
final[k] = true;
//更新当前最短路径及距离
for (int j = 0; j < nodes.Length; j++)
{
if (!final[j] && min + matrix[k, j] < shortPathArr[j])
{
shortPathArr[j] = min + matrix[k, j];
for (int w = 0; w < nodes.Length; w++)
{
pathMatricArr[j, w] = pathMatricArr[k, w];
}
pathMatricArr[j, j] = true;
}
}
}
}
这是C#2.0版的迪杰斯特拉算法,我这儿稍作改动,求给定起始点和终点的最短路径,并且用(v1,cost1,v2)(v2,cost2,v3)数组输出!
各位帮帮忙,我已经纠结了两天了!
太复杂了,分再高点。重赏之下必有勇夫。你贴出的代码是全部的代码吗?
以上的代码是基类的定义啊
!
问题很简单,只是提问题的方式不对。
1:通篇没有说出你的问题在哪里。
2:大片代码没有重点,没有看的欲望。
我贴的代码是基类的定义啊!
我贴的代码是基类的定义啊!
我这儿的意思是给定了源点和终点,求最短路径,我这儿不是定义了一个私有类outmatrix么!
在算法中:方法返回的是outmatrix[] 的格式!