本文整理汇总了C#中IGraph.OutEdges方法的典型用法代码示例。如果您正苦于以下问题:C# IGraph.OutEdges方法的具体用法?C# IGraph.OutEdges怎么用?C# IGraph.OutEdges使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类IGraph
的用法示例。
在下文中一共展示了IGraph.OutEdges方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C#代码示例。
示例1: BottleNeck
/// <summary>
/// Wyszukiwanie "wąskich gardeł" w sieci przesyłowej
/// </summary>
/// <param name="g">Graf przepustowości krawędzi</param>
/// <param name="c">Graf kosztów rozbudowy sieci (kosztów zwiększenia przepustowości)</param>
/// <param name="p">Tablica mocy produkcyjnych/zapotrzebowania w poszczególnych węzłach</param>
/// <param name="flowValue">Maksymalna osiągalna produkcja (parametr wyjściowy)</param>
/// <param name="cost">Koszt rozbudowy sieci, aby możliwe było osiągnięcie produkcji flowValue (parametr wyjściowy)</param>
/// <param name="flow">Graf przepływu dla produkcji flowValue (parametr wyjściowy)</param>
/// <param name="ext">Tablica rozbudowywanych krawędzi (parametr wyjściowy)</param>
/// <returns>
/// 0 - zapotrzebowanie można zaspokoić bez konieczności zwiększania przepustowości krawędzi<br/>
/// 1 - zapotrzebowanie można zaspokoić, ale trzeba zwiększyć przepustowość (niektórych) krawędzi<br/>
/// 2 - zapotrzebowania nie można zaspokoić (zbyt małe moce produkcyjne lub nieodpowiednia struktura sieci
/// - można jedynie zwiększać przepustowości istniejących krawędzi, nie wolno dodawać nowych)
/// </returns>
/// <remarks>
/// Każdy element tablicy p opisuje odpowiadający mu wierzchołek<br/>
/// wartość dodatnia oznacza moce produkcyjne (wierzchołek jest źródłem)<br/>
/// wartość ujemna oznacza zapotrzebowanie (wierzchołek jest ujściem),
/// oczywiście "możliwości pochłaniające" ujścia to moduł wartości elementu<br/>
/// "zwykłym" wierzchołkom odpowiada wartość 0 w tablicy p<br/>
/// <br/>
/// Jeśli funkcja zwraca 0, to<br/>
/// parametr flowValue jest równy modułowi sumy zapotrzebowań<br/>
/// parametr cost jest równy 0<br/>
/// parametr ext jest pustą (zeroelementową) tablicą<br/>
/// Jeśli funkcja zwraca 1, to<br/>
/// parametr flowValue jest równy modułowi sumy zapotrzebowań<br/>
/// parametr cost jest równy sumarycznemu kosztowi rozbudowy sieci (zwiększenia przepustowości krawędzi)<br/>
/// parametr ext jest tablicą zawierającą informację o tym o ile należy zwiększyć przepustowości krawędzi<br/>
/// Jeśli funkcja zwraca 2, to<br/>
/// parametr flowValue jest równy maksymalnej możliwej do osiągnięcia produkcji
/// (z uwzględnieniem zwiększenia przepustowości)<br/>
/// parametr cost jest równy sumarycznemu kosztowi rozbudowy sieci (zwiększenia przepustowości krawędzi)<br/>
/// parametr ext jest tablicą zawierającą informację o tym o ile należy zwiększyć przepustowości krawędzi<br/>
/// Uwaga: parametr ext zawiera informacje jedynie o krawędziach, których przepustowości trzeba zwiększyć
/// (każdy element tablicy to opis jednej takiej krawędzi)
/// </remarks>
public static int BottleNeck(this IGraph g, IGraph c, int[] p, out int flowValue, out int cost, out IGraph flow, out Edge[] ext)
{
flowValue = 0; // ZMIENIĆ
cost = 0; // ZMIENIĆ
flow = new AdjacencyMatrixGraph(true, g.VerticesCount);
ext = new Edge[0]; // ZMIENIĆ
IGraph g1 = new AdjacencyMatrixGraph(true, g.VerticesCount * 2 + 2);
IGraph c1 = new AdjacencyMatrixGraph(true, g.VerticesCount * 2 + 2);
IGraph flow2;
List<Edge> ext1 = new List<Edge>();
int wplywy = 0, minw = 0, maxw= 0;
for (int i = 0; i < g.VerticesCount; i++)
{
foreach (var e in g.OutEdges(i))
{
g1.AddEdge(i, e.To, e.Weight);
g1.AddEdge(i + g.VerticesCount + 2, e.To, int.MaxValue);
g1.AddEdge(i, i + g.VerticesCount + 2, int.MaxValue);
}
foreach (var e in c.OutEdges(i))
{
c1.AddEdge(i, e.To, 0);
c1.AddEdge(i + g.VerticesCount + 2, e.To, e.Weight);
c1.AddEdge(i, i + g.VerticesCount + 2, 0);
}
}
for (int i = 0; i < g.VerticesCount; i++)
if (p[i] > 0)
{
g1.AddEdge(g.VerticesCount, i, Math.Abs(p[i]));
c1.AddEdge(g.VerticesCount, i, 0);
}
else if (p[i] < 0)
{
g1.AddEdge(i, g.VerticesCount+ 1, Math.Abs(p[i]));
c1.AddEdge(i, g.VerticesCount + 1, 0);
}
cost = g1.MinCostFlow(c1, g.VerticesCount, g.VerticesCount + 1, out flow2);
for (int i = 0; i < g.VerticesCount; i++)
foreach (var e in flow2.OutEdges(i))
if (i != g.VerticesCount && e.To != g.VerticesCount + 1 && e.To != i + g.VerticesCount + 2)
flow.AddEdge(i, e.To, e.Weight +(int)flow2.GetEdgeWeight(i + g.VerticesCount + 2, e.To));
for (int i = g.VerticesCount + 2; i<= 2 * g.VerticesCount +1; i++)
foreach (var e in flow2.OutEdges(i))
if (e.Weight != 0 && e.To != i+ g.VerticesCount + 2 && i != g.VerticesCount && e.To != g.VerticesCount + 1)
{
ext1.Add(new Edge(i - g.VerticesCount - 2, e.To, e.Weight));
flow.ModifyEdgeWeight(i -g.VerticesCount - 2, e.To, e.Weight);
}
ext = ext1.ToArray();
foreach (var e in flow2.OutEdges(g.VerticesCount))
flowValue+=e.Weight;
//.........这里部分代码省略.........
示例2: Test
internal static bool Test(IGraph g, int[] colors)
{
int n = g.VerticesCount;
for (int i = 0; i < n; i++)
{
int moj_kolor = colors[i];
foreach (Edge e in g.OutEdges(i))
{
if (colors[e.To] == moj_kolor)
return false;
}
}
return true;
}
示例3: BottleNeckM
/// <summary>
/// Wyszukiwanie "wąskich gardeł" w sieci przesyłowej
/// </summary>
/// <param name="g">Graf przepustowości krawędzi</param>
/// <param name="c">Graf kosztów rozbudowy sieci (kosztów zwiększenia przepustowości)</param>
/// <param name="p">Tablica mocy produkcyjnych/zapotrzebowania w poszczególnych węzłach</param>
/// <param name="flowValue">Maksymalna osiągalna produkcja (parametr wyjściowy)</param>
/// <param name="cost">Koszt rozbudowy sieci, aby możliwe było osiągnięcie produkcji flowValue (parametr wyjściowy)</param>
/// <param name="flow">Graf przepływu dla produkcji flowValue (parametr wyjściowy)</param>
/// <param name="ext">Tablica rozbudowywanych krawędzi (parametr wyjściowy)</param>
/// <returns>
/// 0 - zapotrzebowanie można zaspokoić bez konieczności zwiększania przepustowości krawędzi<br/>
/// 1 - zapotrzebowanie można zaspokoić, ale trzeba zwiększyć przepustowość (niektórych) krawędzi<br/>
/// 2 - zapotrzebowania nie można zaspokoić (zbyt małe moce produkcyjne lub nieodpowiednia struktura sieci
/// - można jedynie zwiększać przepustowości istniejących krawędzi, nie wolno dodawać nowych)
/// </returns>
/// <remarks>
/// Każdy element tablicy p opisuje odpowiadający mu wierzchołek<br/>
/// wartość dodatnia oznacza moce produkcyjne (wierzchołek jest źródłem)<br/>
/// wartość ujemna oznacza zapotrzebowanie (wierzchołek jest ujściem),
/// oczywiście "możliwości pochłaniające" ujścia to moduł wartości elementu<br/>
/// "zwykłym" wierzchołkom odpowiada wartość 0 w tablicy p<br/>
/// <br/>
/// Jeśli funkcja zwraca 0, to<br/>
/// parametr flowValue jest równy modułowi sumy zapotrzebowań<br/>
/// parametr cost jest równy 0<br/>
/// parametr ext jest pustą (zeroelementową) tablicą<br/>
/// Jeśli funkcja zwraca 1, to<br/>
/// parametr flowValue jest równy modułowi sumy zapotrzebowań<br/>
/// parametr cost jest równy sumarycznemu kosztowi rozbudowy sieci (zwiększenia przepustowości krawędzi)<br/>
/// parametr ext jest tablicą zawierającą informację o tym o ile należy zwiększyć przepustowości krawędzi<br/>
/// Jeśli funkcja zwraca 2, to<br/>
/// parametr flowValue jest równy maksymalnej możliwej do osiągnięcia produkcji
/// (z uwzględnieniem zwiększenia przepustowości)<br/>
/// parametr cost jest równy sumarycznemu kosztowi rozbudowy sieci (zwiększenia przepustowości krawędzi)<br/>
/// parametr ext jest tablicą zawierającą informację o tym o ile należy zwiększyć przepustowości krawędzi<br/>
/// Uwaga: parametr ext zawiera informacje jedynie o krawędziach, których przepustowości trzeba zwiększyć
// (każdy element tablicy to opis jednej takiej krawędzi)
/// </remarks>
public static int BottleNeckM(this IGraph g, IGraph c, int[] p, out int flowValue, out int cost, out IGraph flow, out Edge[] ext)
{
flowValue = 0;
cost = 0;
flow = g.IsolatedVerticesGraph();
ext = new Edge[0];
//return 2;
IGraph mincostFlow;
int balans = 0;
int minv = 0;
int maxv = 0;
int n = g.VerticesCount;
IGraph gnew = new AdjacencyMatrixGraph(true, 2 * n + 2);
IGraph cnew = new AdjacencyMatrixGraph(true, 2 * n + 2);
// <0;n-1> wierzcholki
// n, n+1 to zrodlo i ujscie
// <n+2;2n+1> to zdublowane wierzcholki
//Krawedzie
for (int i = 0; i < n; i++)
{
foreach (Edge e in g.OutEdges(i))
{
gnew.AddEdge(e.From, e.To, e.Weight);
gnew.AddEdge(n + 2 + e.From, e.To, int.MaxValue);
gnew.AddEdge(e.From, n + 2 + e.From, int.MaxValue);
}
foreach (Edge e in c.OutEdges(i))
{
cnew.AddEdge(e.From, e.To, 0);
cnew.AddEdge(e.From + n + 2, e.To, e.Weight);
cnew.AddEdge(e.From, e.From + n + 2, 0);
}
}
//Jedno zrodlo i ujscie
for (int i = 0; i < n; i++)
{
if (p[i] > 0)
{
gnew.AddEdge(n, i, p[i]);
cnew.AddEdge(n, i, 0);
}
else if (p[i] < 0)
{
gnew.AddEdge(i, n + 1, -p[i]);
cnew.AddEdge(i, n + 1, 0);
}
}
cost = gnew.MinCostFlow(cnew, n, n + 1, out mincostFlow);
flow = new AdjacencyMatrixGraph(true, n);
for (int i = 0; i < n; i++)
foreach (Edge e in mincostFlow.OutEdges(i))
{
if (e.From == n || e.To == n + 1 || e.To == e.From + n + 2 ) continue;
flow.AddEdge(e.From, e.To, e.Weight + (int)mincostFlow.GetEdgeWeight(e.From + n + 2, e.To));
}
//.........这里部分代码省略.........