1.最短路径算法
画一张图:简单
首先是连通图,单向连通图
1-4找到最短路径 first-last
遍历所有节点
1-所有节点判断,如果有的话前继节点就是1 2,5
这个时候我们就需要判断这几个节点2,5
但是我们还得遍历,因为我们不知道 这个时候找2的前继节点是
1吗?可能有其他路径在2没关系局部最优,因为如果有其他节点到2的话说明这个节点可以到2
如果距离更小,那么就选择这个节点为前继节点,但是必须是已经连接的节点,
复杂也就是这个原理
public int[,] matirx()
{
int[,] a = new int[5,5];
//int[][] a = a;
//Console.WriteLine(a);
for(int i = 0; i < 5; i++)
{
for (int j = 0; j < 5; j++)
a[i,j] = 10000;
}
a[0,0] = 6;
a[0,1] = 5;
a[0, 4] = 1;
a[4, 3] = 1;
a[3, 1] = 1;
a[1,2] = 7;
return a;
}
public void dijiesitela()
{
int dis;
int[,] a = matirx();
//dis = a[0,2];
int[] value = new int[5];
int[] arr = new int[5];
bool[] flag1 = new bool[5];
//b[0]=
int first = 0;
int last = 2;
int count = 0;
int flag = 10000;
for(int xu = 0; xu < 5; xu++)
{
for(int xu1 = 0; xu1 < 5; xu1++)
{
Console.Write(a[xu, xu1] + " ");
}
Console.WriteLine();
}
for (int i = 0; i < 5; i++)
{
value[i] = 10000;
flag1[i] = false;
}
value[first] = 0;
for (int i = 0; i < 5; i++)
{
for (int ii = 0; ii < 5; ii++)
{
if (!flag1[ii] && value[ii] < 10000)
{
first = ii;
//Console.WriteLine(first);
}
}
flag1[first] = true;
//里面 判断first节点的后继节点
//first要改变
for (int j = 0; j < 5; j++)
{
if (j != first && value[first] + a[first,j] < value[j])
{
arr[j] = first;
value[j] = value[first] + a[first,j];
}
}
}
int[] last1 = new int[5];
last1[0] = 0;
last1[last] = 2;
/*for (int intint = 0; intint < arr.Length; intint++)
Console.WriteLine(arr[intint]);*/
int count1 = 1;
while (arr[last] != 0)
{
Console.WriteLine(arr[last]);
last = arr[last];
last1[count1]= arr[last];
}
//sleep(1000);
while (true)
{
Console.Write("");
}
}