本文整理汇总了C#中Heap.Next方法的典型用法代码示例。如果您正苦于以下问题:C# Heap.Next方法的具体用法?C# Heap.Next怎么用?C# Heap.Next使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Heap
的用法示例。
在下文中一共展示了Heap.Next方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: LabelCorrecting
public static Graph LabelCorrecting(Graph g, int vert)
{
Output.WriteLine("[Label Correcting Output]");
//Not working, I think because of the two loops for in and out edges
//Change this to assume g is an undirected graph
//Keep a heap of vertices, based on their distance label
//Each one is initially infinity, except the intial vertex, which is 0
Graph copy = new Graph();
Graph tree = new Graph();
//Create a copy to preserve g's state
g.CopyTo(copy);
List<Vertex> vertices = copy.GetVertices();
List<Edge> edges = copy.GetEdges();
DijkstraData v = new DijkstraData();
v.Predecessor = null;
v.InQ = false;
v.V = vertices[vert];
v.D = 0;
v.InTree = false;
v.EdgeLength = float.PositiveInfinity;
vertices[vert].Tag = v;
Heap<DijkstraData> q = new Heap<DijkstraData>(true);
q.Add(vertices[vert].Tag as DijkstraData);
(vertices[vert].Tag as DijkstraData).InQ = true;
foreach (Vertex u in vertices)
{
if (!v.V.Equals(u))
{
DijkstraData dd = new DijkstraData();
dd.D = float.PositiveInfinity;
dd.V = u;
dd.InTree = false;
dd.InQ = false;
u.Tag = dd;
}
}
float maxEdgeWeight = float.NegativeInfinity;
foreach (Edge e in edges)
{
if (Math.Abs(e.Weight) > maxEdgeWeight)
{
maxEdgeWeight = Math.Abs(e.Weight);
}
}
int n = vertices.Count;
float negativeCycleCheck = n * -maxEdgeWeight;
while (q.HasNext())
{
DijkstraData dd = q.Next();
dd.InQ = false;
/*if (dd.Predecessor == null)
{
tree.AddVertex(dd.V);
}
else
{
tree.AddEdge(new Edge(dd.Predecessor, dd.V, dd.EdgeLength));
dd.InTree = true;
}*/
foreach (Edge e in dd.V.GetOutEdges())
{
Vertex connectedVertex = e.GetToVertex();
DijkstraData data = connectedVertex.Tag as DijkstraData;
if (data.D > dd.D + e.Weight)
{
data.D = dd.D + e.Weight;
if (data.D < negativeCycleCheck)
{
throw new Exception("Negative cycle detected!");
}
data.Predecessor = dd.V;
if (!q.Contains(data))
{
q.Add(data);
data.InQ = true;
}
}
}
if (g.Directed)
{
continue;
}
foreach (Edge e in dd.V.GetInEdges())
{
Vertex connectedVertex = e.GetFromVertex();
DijkstraData data = connectedVertex.Tag as DijkstraData;
//.........这里部分代码省略.........
示例2: PrimMST
public static Graph PrimMST(Graph g)
{
if (g.Directed)
{
Output.WriteLine("Can't run Prim's algorithm on a directed graph");
return null;
}
Graph copy = new Graph();
Graph mst = new Graph();
//Create a copy to preserve g's state
g.CopyTo(copy);
List<Vertex> vertices = copy.GetVertices();
foreach (Vertex vert in vertices)
{
mst.AddVertex(vert);
}
PrimData v = new PrimData();
v.Predecessor = null;
v.Seen = true;
v.V = vertices[0];
v.D = 0;
v.InMST = true;
v.EdgeLength = float.PositiveInfinity;
vertices[0].Tag = v;
foreach (Vertex u in vertices)
{
if (!v.V.Equals(u))
{
PrimData pd = new PrimData();
pd.D = float.PositiveInfinity;
pd.V = u;
pd.InMST = false;
pd.Seen = false;
u.Tag = pd;
}
}
Heap<PrimData> q = new Heap<PrimData>(true);
q.Add(vertices[0].Tag as PrimData);
while (q.HasNext())
{
PrimData pd = q.Next();
if (pd.Predecessor == null)
{
//mst.AddVertex(pd.V);
}
else
{
string label = pd.V.Label;
mst.AddEdge(new Edge(pd.Predecessor, pd.V, pd.EdgeLength));
pd.V.Label = label;
pd.InMST = true;
}
foreach (Edge e in pd.V.GetOutEdges())
{
Vertex connectedVertex = e.GetToVertex();
PrimData data = connectedVertex.Tag as PrimData;
if (!data.Seen)
{
q.Add(data);
data.Predecessor = pd.V;
data.EdgeLength = e.Weight;
data.Seen = true;
}
if (data.D > e.Weight && !data.InMST)
{
data.D = e.Weight;
data.Predecessor = pd.V;
data.EdgeLength = e.Weight;
q.Update(data);
}
}
/*foreach (Edge e in pd.V.GetInEdges())
{
Vertex connectedVertex = e.GetFromVertex();
PrimData data = connectedVertex.Tag as PrimData;
if (!data.Seen)
{
q.Add(data);
data.Predecessor = pd.V;
data.EdgeLength = e.Weight;
data.Seen = true;
}
if (data.D > e.Weight && !data.InMST)
{
data.D = e.Weight;
data.Predecessor = pd.V;
data.EdgeLength = e.Weight;
q.Update(data);
}
}*/
}
//.........这里部分代码省略.........
示例3: Dijkstra
public static Graph Dijkstra(Graph g, int vert, bool directed)
{
Output.WriteLine("[Dijkstra Output]");
//If I get a negative edge weight, tell user to use label correcting instead of dijkstra's
//Change this to assume g is an undirected graph
//Keep a heap of vertices, based on their distance label
//Each one is initially infinity, except the intial vertex, which is 0
Graph copy = new Graph();
Graph tree = new Graph();
//Create a copy to preserve g's state
g.CopyTo(copy);
List<Vertex> vertices = copy.GetVertices();
List<Edge> edges = copy.GetEdges();
DijkstraData v = new DijkstraData();
v.Predecessor = null;
v.InQ = false;
v.V = vertices[vert];
v.D = 0;
v.InTree = false;
v.EdgeLength = float.PositiveInfinity;
vertices[vert].Tag = v;
Heap<DijkstraData> q = new Heap<DijkstraData>(true);
q.Add(vertices[vert].Tag as DijkstraData);
(vertices[vert].Tag as DijkstraData).InQ = true;
foreach (Vertex u in vertices)
{
if (!v.V.Equals(u))
{
DijkstraData dd = new DijkstraData();
dd.D = float.PositiveInfinity;
dd.V = u;
dd.InTree = false;
u.Tag = dd;
q.Add(dd);
dd.InQ = true;
}
}
foreach (Edge e in edges)
{
if (e.Weight < 0)
{
Output.WriteLine("Negative edge weight detected. Use Label Correcting instead of Dijkstra");
return null;
}
}
while (q.HasNext())
{
DijkstraData dd = q.Next();
dd.InQ = false;
/*if (dd.Predecessor == null)
{
tree.AddVertex(dd.V);
dd.InTree = true;
}
else
{
tree.AddEdge(new Edge(dd.Predecessor, dd.V, dd.EdgeLength));
dd.InTree = true;
}*/
foreach (Edge e in dd.V.GetOutEdges())
{
Vertex connectedVertex = e.GetToVertex();
DijkstraData data = connectedVertex.Tag as DijkstraData;
if (data.InQ)
{
if (dd.D + e.Weight < data.D)
{
if (dd.D + e.Weight < data.D)
{
data.D = dd.D + e.Weight;
q.Update(data);
}
}
}
}
//If this is a directed graph, don't consider in edges
if (directed)
{
continue;
}
foreach (Edge e in dd.V.GetInEdges())
{
Vertex connectedVertex = e.GetFromVertex();
DijkstraData data = connectedVertex.Tag as DijkstraData;
if (data.InQ)
{
//.........这里部分代码省略.........