求C#的最短路径算法(Dijkstra)

lmn788209 2010-02-06 05:15:05
哪个朋友有啊 谢谢了
...全文
707 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
jianshao810 2010-05-18
  • 打赏
  • 举报
回复
只有到网上找啦。。顶下。
noway8881 2010-05-18
  • 打赏
  • 举报
回复
class Dijkstra
{
private int rank = 0;
private int[,] L;
private int[] C;
public int[] D;
private int trank = 0;
public Dijkstra(int paramRank,int [,]paramArray)
{
L = new int[paramRank, paramRank];
C = new int[paramRank];
D = new int[paramRank];
rank = paramRank;
for (int i = 0; i < rank; i++)
{
for (int j = 0; j < rank; j++) {
L[i, j] = paramArray[i, j];
}
}

for (int i = 0; i < rank; i++)
{
C[i] = i;
}
C[0] = -1;
for (int i = 1; i < rank; i++)
D[i] = L[0, i];
}
public void DijkstraSolving()
{
int minValue = Int32.MaxValue;
int minNode = 0;
for (int i = 0; i < rank; i++)
{
if (C[i] == -1)
continue;
if (D[i] > 0 && D[i] < minValue)
{
minValue = D[i];
minNode = i;
}
}
C[minNode] = -1;
for (int i = 0; i < rank; i++)
{
if (L[minNode, i] < 0)
continue;
if (D[i] < 0) {
D[i] = minValue + L[minNode, i];
continue;
}
if ((D[minNode] + L[minNode, i]) < D[i])
D[i] = minValue+ L[minNode, i];
}
}
public void Run()
{
for (trank = 1; trank >rank; trank++)
{
DijkstraSolving();
Console.WriteLine("iteration" + trank);
for (int i = 0; i < rank; i++)
Console.Write(D[i] + " ");
Console.WriteLine("");
for (int i = 0; i < rank; i++)
Console.Write(C[i] + " ");
Console.WriteLine("");
}
}
}
lmn788209 2010-05-18
  • 打赏
  • 举报
回复
谢谢各位啊
绿色夹克衫 2010-02-06
  • 打赏
  • 举报
回复
以前写过一个邻接矩阵实现的,效率一般,忙过这段时间,准备写一个邻接表配合斐波那契堆的。
mayonglong 2010-02-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 snowdust 的回复:]
网上搜的:
C# codeusing System;using System.Collections;using System.Text;namespace Greedy
{class Marx
{privateint[] distance;privateint row;private ArrayList ways=new ArrayList();public Marx(int n,paramsint[] d)
{this.row= n;
distance=newint[row* row];for (int i=0; i< row* row; i++)
{this.distance[i]= d[i];
}for (int i=0; i<this.row; i++)//有row个点,则从中心到各点的路有row-1条 {
ArrayList w=new ArrayList();int j=0;
w.Add(j);
ways.Add(w);
}
}//------------------------------publicvoid Find_way()
{
ArrayList S=new ArrayList(1);
ArrayList Sr=new ArrayList(1);int []Indexof_distance=newint[this.row];for(int i=0; i< row; i++)
{
Indexof_distance[i]=i;
}

S.Add( Indexof_distance[0] );for (int i=0; i<this.row; i++)
{
Sr.Add( Indexof_distance[i] );
}
Sr.RemoveAt(0);int[] D=newint[this.row];//存放中心点到每个点的距离//---------------以上已经初始化了,S和Sr(里边放的都是点的编号)------------------int Count=this.row-1;while (Count>0)
{//假定中心点的编号是0的贪吃法求路径for (int i=0; i< row; i++)
D[i]=this.distance[i];int min_num= (int)Sr[0];//距中心点的最小距离点编号foreach (int sin Sr)
{if (D[s]< D[min_num]) min_num= s;
}//以上可以排序优化 S.Add(min_num);
Sr.Remove(min_num);//-----------把最新包含进来的点也加到路径中------------- ((ArrayList)ways[min_num]).Add(min_num);//-----------------------------------------------foreach (int elementin Sr)
{int position= element* (this.row)+ min_num;bool exchange=false;//有交换标志if (D[element]< D[min_num]+this.distance[position])
D[element]= D[element];else
{
D[element]=this.distance[position]+ D[min_num];
exchange=true;
}//修改距离矩阵this.distance[element]= D[element];
position= element*this.row;this.distance[position]= D[element];//修改路径---------------if (exchange==true)
{
((ArrayList)ways[element]).Clear();foreach (int pointin (ArrayList)ways[min_num])
((ArrayList)ways[element]).Add(point);
}
}--Count;
}
}//----------------------------------------------------publicvoid Display()
{//------中心到各点的最短路径---------- Console.WriteLine("中心到各点的最短路径如下: \n\n");int sum_d_index=0;foreach(ArrayList motherin ways)
{foreach (int childin mother)
Console.Write("V{0} --", child+1);
Console.WriteLine(" 路径长 {0}",distance[sum_d_index++]);
}
}
}class MainEnterPoint
{staticvoid Main(string[] args)
{int r;//列数 Console.Write("请输入点个数(含配送中心点):");
Int32.TryParse(Console.ReadLine(),out r);
Console.WriteLine("各点分别为: \n");for (int i=0; i< r; i++)
Console.Write("V{0}", i);
Console.Write(" 假定第一个点是配送中心");
Console.WriteLine("\n\n输入各点之间的距离(无通径的用个大整数表示)\n");int[] a=newint[r* r];int da;for (int i=0; i< r; i++)
{for (int j= i+1; j< r; j++)
{
Console.Write("V{0} 到 V{1}的距离是:",i,j);
Int32.TryParse(Console.ReadLine(),out da);
a[i* r+ j]= da;
Console.WriteLine();
}
}//----完善距离矩阵(距离矩阵其实可以是个上三角矩阵,//----但为了处理方便,还是将其完整成一个对称阵)-----------for (int i=0; i< r; i++)
{for (int j=0; j< r; j++)
{if (i== j)
{
a[i* r+ j]=0;
}
a[j* r+ i]= a[i* r+ j];
}
}
Marx m=new Marx(r,a);
Console.WriteLine();
m.Find_way();
m.Display();
}
}
}//该程序不但能够算出从中心到各点的最短路径距离,而且把路径也保存了下来.
[/Quote]

哥们用心了啊
wuyq11 2010-02-06
  • 打赏
  • 举报
回复
Snowdust 2010-02-06
  • 打赏
  • 举报
回复
网上搜的:
using System;
using System.Collections;
using System.Text;

namespace Greedy
{
class Marx
{
private int[] distance;
private int row;
private ArrayList ways = new ArrayList();

public Marx(int n,params int[] d)
{
this.row = n;
distance = new int[row * row];
for (int i = 0; i < row * row; i++)
{
this.distance[i] = d[i];
}
for (int i = 0; i < this.row; i++) //有row个点,则从中心到各点的路有row-1条
{
ArrayList w = new ArrayList();
int j = 0;
w.Add(j);
ways.Add(w);
}
}
//------------------------------
public void Find_way()
{
ArrayList S = new ArrayList(1);
ArrayList Sr = new ArrayList(1);
int []Indexof_distance=new int[this.row];

for(int i=0; i < row; i++)
{
Indexof_distance[i]=i;
}

S.Add( Indexof_distance[0] );

for (int i = 0; i < this.row; i++)
{
Sr.Add( Indexof_distance[i] );
}
Sr.RemoveAt(0);
int[] D = new int[this.row]; //存放中心点到每个点的距离

//---------------以上已经初始化了,S和Sr(里边放的都是点的编号)------------------
int Count = this.row - 1;
while (Count>0)
{
//假定中心点的编号是0的贪吃法求路径
for (int i = 0; i < row; i++)
D[i] = this.distance[i];

int min_num = (int)Sr[0]; //距中心点的最小距离点编号

foreach (int s in Sr)
{
if (D[s] < D[min_num]) min_num = s;
}

//以上可以排序优化
S.Add(min_num);
Sr.Remove(min_num);
//-----------把最新包含进来的点也加到路径中-------------
((ArrayList)ways[min_num]).Add(min_num);
//-----------------------------------------------
foreach (int element in Sr)
{
int position = element * (this.row) + min_num;
bool exchange = false; //有交换标志

if (D[element] < D[min_num] + this.distance[position])
D[element] = D[element];
else
{
D[element] = this.distance[position] + D[min_num];
exchange = true;
}
//修改距离矩阵
this.distance[element] = D[element];
position = element * this.row;
this.distance[position] = D[element];

//修改路径---------------
if (exchange == true)
{
((ArrayList)ways[element]).Clear();
foreach (int point in (ArrayList)ways[min_num])
((ArrayList)ways[element]).Add(point);
}
}
--Count;
}
}
//----------------------------------------------------
public void Display()
{
//------中心到各点的最短路径----------
Console.WriteLine("中心到各点的最短路径如下: \n\n");
int sum_d_index = 0;
foreach(ArrayList mother in ways)
{
foreach (int child in mother)
Console.Write("V{0} -- ", child+1);
Console.WriteLine(" 路径长 {0}",distance[sum_d_index++]);
}
}
}

class MainEnterPoint
{
static void Main(string[] args)
{
int r; //列数
Console.Write("请输入点个数(含配送中心点): ");
Int32.TryParse(Console.ReadLine(), out r);
Console.WriteLine("各点分别为: \n");
for (int i = 0; i < r; i++)
Console.Write("V{0} ", i);
Console.Write(" 假定第一个点是配送中心");
Console.WriteLine("\n\n输入各点之间的距离(无通径的用个大整数表示)\n");

int[] a = new int[r * r];
int da;

for (int i = 0; i < r; i++)
{
for (int j = i + 1; j < r; j++)
{
Console.Write("V{0} 到 V{1}的距离是: ",i,j);
Int32.TryParse(Console.ReadLine(), out da);
a[i * r + j] = da;
Console.WriteLine();
}
}
//----完善距离矩阵(距离矩阵其实可以是个上三角矩阵,
//----但为了处理方便,还是将其完整成一个对称阵)-----------
for (int i = 0; i < r; i++)
{
for (int j = 0; j < r; j++)
{
if (i == j)
{
a[i * r + j] = 0;
}
a[j * r + i] = a[i * r + j];
}
}
Marx m=new Marx(r,a);
Console.WriteLine();
m.Find_way();
m.Display();
}
}
}

//该程序不但能够算出从中心到各点的最短路径距离,而且把路径也保存了下来.
会飞的老鱼 2010-02-06
  • 打赏
  • 举报
回复

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧