首页 新闻 赞助 找找看

最短路径问题求助

0
悬赏园豆:100 [已关闭问题] 关闭于 2012-04-18 14:16
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)数组输出!

各位帮帮忙,我已经纠结了两天了!
 

小云菜的主页 小云菜 | 初学一级 | 园豆:101
提问于:2012-04-06 16:34
< >
分享
所有回答(2)
0

太复杂了,分再高点。重赏之下必有勇夫。你贴出的代码是全部的代码吗?

会长 | 园豆:12399 (专家六级) | 2012-04-06 18:01

以上的代码是基类的定义啊
!

支持(0) 反对(0) 小云菜 | 园豆:101 (初学一级) | 2012-04-07 22:35
0

问题很简单,只是提问题的方式不对。

1:通篇没有说出你的问题在哪里。

2:大片代码没有重点,没有看的欲望。

zsounder | 园豆:2819 (老鸟四级) | 2012-04-06 18:50

我贴的代码是基类的定义啊!

支持(0) 反对(0) 小云菜 | 园豆:101 (初学一级) | 2012-04-07 22:27

我贴的代码是基类的定义啊!

我这儿的意思是给定了源点和终点,求最短路径,我这儿不是定义了一个私有类outmatrix么!

在算法中:方法返回的是outmatrix[] 的格式!

支持(0) 反对(0) 小云菜 | 园豆:101 (初学一级) | 2012-04-07 22:32
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册