当前位置: 首页>>代码示例>>C#>>正文


C# IGraph.OutEdges方法代码示例

本文整理汇总了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;

//.........这里部分代码省略.........
开发者ID:kelostrada-pjatk,项目名称:asd2,代码行数:101,代码来源:BottleNeck.cs

示例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;
 }
开发者ID:tpsa,项目名称:pwsg,代码行数:14,代码来源:Coloring.cs

示例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));
                }
//.........这里部分代码省略.........
开发者ID:kelostrada-pjatk,项目名称:asd2,代码行数:101,代码来源:BottleNeckM.cs


注:本文中的IGraph.OutEdges方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。