最短路径
最短路径的性质
- 路径是有向的
- 不需要所有边都可达
- 负权重会使问题变得更复杂
- 最短路径不是唯一的
这里讨论的是单点最短路径,即找出从一个起点到所有可达顶点的最短路径构成的最短路径树。
有向加权图的数据结构
有向边的结构比无向边简单,有确定的起点和终点
有向边的结构:
public class DirectEdge
{
private int v; //起点
private int w; //终点
private double weight;
public DirectEdge(int form, int to, double weight)
{
this.v = form;
this.w = to;
this.weight = weight;
}
public int Form => v;
public int To => w;
public double Weight => weight;
}
加权有向图的结构:
//加权有向图
public class EdgeWeightedDigraph
{
private int v;
private List<DirectEdge>[] _adj; //邻接表
private int e;
public EdgeWeightedDigraph(string path)
{
string line;
System.IO.StreamReader sr = new System.IO.StreamReader(path);
v = Convert.ToInt32(sr.ReadLine());
e = 0;
_adj = new List<DirectEdge>[v];
for (int i = 0; i < v; i++) { _adj[i] = new List<DirectEdge>(); }
while ((line = sr.ReadLine()) != null)
{
string[] str = line.Split(' ');
int a = Convert.ToInt32(str[0]);
int b = Convert.ToInt32(str[1]);
float w = (float)Convert.ToDouble(str[2]);
AddEdge(new DirectEdge(a, b, w));
}
}
public EdgeWeightedDigraph(int v)
{
_adj = new List<DirectEdge>[v];
for (int i = 0; i < v; i++)
{
_adj[i] = new List<DirectEdge>();
}
this.v = v;
e =