Advertisement
Guest User

Untitled

a guest
Mar 25th, 2017
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.04 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using ASD.Graphs;
  7.  
  8. namespace ASD
  9. {
  10.     public static class MatchingGraphExtender
  11.     {
  12.         /// <summary>
  13.         /// Podział grafu na cykle. Zakładamy, że dostajemy graf nieskierowany i wszystkie wierzchołki grafu mają parzyste stopnie
  14.         /// (nie trzeba sprawdzać poprawności danych).
  15.         /// </summary>
  16.         /// <param name="G">Badany graf</param>
  17.         /// <returns>Tablica cykli; krawędzie każdego cyklu powinny być uporządkowane zgodnie z kolejnością na cyklu, zaczynając od dowolnej</returns>
  18.         /// <remarks>
  19.         /// Metoda powinna działać w czasie O(m)
  20.         /// </remarks>
  21.         ///
  22.  
  23.         public static void DFSEuler(Graph g, int u, Stack<int> S, int[] wierz)
  24.         {
  25.             wierz[u] = 1;
  26.             foreach (Edge e in g.OutEdges(u))
  27.             {
  28.                 g.DelEdge(e);
  29.                 DFSEuler(g, e.To, S, wierz);
  30.             }
  31.             S.Push(u);
  32.         }
  33.  
  34.         public static Edge[][] cyclePartition(this Graph G)
  35.         {
  36.             List<Edge[]> cyklList = new List<Edge[]>();
  37.             Graph g = G.Clone();
  38.             Stack<int> S = new Stack<int>();
  39.             int[] wierz = new int[g.VerticesCount];
  40.             for (int i = 0; i < g.VerticesCount; i++)
  41.                 if (wierz[i] == 0)
  42.                 {
  43.                     DFSEuler(g, i, S, wierz);
  44.                     List<Edge> lista = new List<Edge>();
  45.                     while (S.Count > 1)
  46.                         lista.Add(new Edge(S.Pop(), S.Peek()));
  47.                     Edge[] cyklTab = new Edge[lista.Count];
  48.                     for (int j = 0; j < lista.Count; j++)
  49.                         cyklTab[j] = lista[j];
  50.                     cyklList.Add(cyklTab);
  51.                     S.Clear();
  52.                 }
  53.             Edge[][] cykleZwr = new Edge[cyklList.Count][];
  54.             for (int j = 0; j < cyklList.Count; j++)
  55.                 cykleZwr[j] = cyklList[j];
  56.             return cykleZwr;
  57.         }
  58.  
  59.  
  60.  
  61.  
  62.  
  63.         /// <summary>
  64.         /// Szukanie skojarzenia doskonałego w grafie nieskierowanym o którym zakładamy, że jest dwudzielny i 2^r-regularny
  65.         /// (nie trzeba sprawdzać poprawności danych)
  66.         /// </summary>
  67.         /// <param name="G">Badany graf</param>
  68.         /// <returns>Skojarzenie doskonałe w G</returns>
  69.         /// <remarks>
  70.         /// Metoda powinna działać w czasie O(m), gdzie m jest liczbą krawędzi grafu G
  71.         /// </remarks>
  72.         public static Graph perfectMatching(this Graph G)
  73.         {
  74.             Graph g = G.Clone();
  75.             Edge[][] tab = g.cyclePartition();
  76.             foreach (Edge[] cykl in tab)
  77.             {
  78.                 int suma = 0;
  79.                 foreach (Edge e in g.OutEdges(cykl[0].From))
  80.                     suma++;
  81.                 for (int i = 0; i < cykl.Length; i+=2)
  82.                     g.DelEdge(cykl[i]);
  83.             }
  84.             return g;
  85.         }
  86.     }
  87. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement