예제 #1
0
파일: Program.cs 프로젝트: sokolowskip/WMH
        private static Graph ReadFromFile(string fileName)
        {
            //The format of line is:
            //   Id: id_neighbour_1, id_neighbour_2, ... , id_nieghbour_n
            var g = new Graph();
            var allLines = File.ReadAllLines(fileName);
            var splittedAllLines = allLines.Select(x => x.Split(':'));
            if (splittedAllLines.Any(x => x.Count() != 2))
                throw new InvalidFileFormatException();

            foreach (var id in splittedAllLines.Select(x => x[0]))
            {
                g.AddVertex(ParseVertexId(id));
            }
            foreach (var line in splittedAllLines)
            {
                var fromId = ParseVertexId(line[0]);
                var neighbours = line[1].Split(',');
                foreach (var neighbour in neighbours)
                {
                    int toId = ParseVertexId(neighbour);
                    if(!g.ContainsVertex(toId))
                        throw new InvalidFileFormatException();
                    g.AddDirectedEdge(fromId, toId);
                }
            }
            return g;
        }
예제 #2
0
 public BipartiteTestingAlgorithm(Graph graph)
 {
     this.verticies = graph.AllVerticies.ToList();
     vertexColors = new Dictionary<int, Color?>();
     foreach (var vertex in graph.AllVerticies)
     {
         vertexColors[vertex.Id] = null;
     }
 }
예제 #3
0
 private Edge? GetEdgeToExtend(Graph g, Edge e)
 {
     foreach (var e2 in NonplanarSubgraph.GetAllEdges())
     {
         if (!g.ContainsEdge(e2.U, e2.V) && g.ContainsEdge(e.V, e2.U) && g.ContainsEdge(e.V, e2.V))
         {
             return e2;
         }
     }
     return null;
 }
예제 #4
0
 private void ExtendNonplanarSubgraph(Graph g, Edge e)
 {
     var toExtend = GetEdgeToExtend(g, e);
     if (toExtend != null)
     {
        NonplanarSubgraph.RemoveEdge(toExtend.Value);
        NonplanarSubgraph.AddVertex(e.V);
        NonplanarSubgraph.AddUndirectedEdge(e.V, toExtend.Value.V);
        NonplanarSubgraph.AddUndirectedEdge(e.V, toExtend.Value.U);
     }
 }
예제 #5
0
파일: Graph.cs 프로젝트: sokolowskip/WMH
 public static Graph CreateBipartiteGraph(int n, int m)
 {
     var graph = new Graph();
     graph.AddVerticiesRange(n + m);
     for (int i = 0; i < n; i++)
     {
         for (int j = n; j < n+m; j++)
         {
             graph.AddUndirectedEdge(i, j);
         }
     }
     return graph;
 }
예제 #6
0
파일: Graph.cs 프로젝트: sokolowskip/WMH
        public static Graph CreateCompleteGraph(int size)
        {
            var graph = new Graph();
            graph.AddVerticiesRange(size);

            for (int i = 0; i < size; i++)
            {
                for (int j = 0; j < i; j++)
                {
                    graph.AddUndirectedEdge(i, j);
                }
            }
            return graph;
        }
예제 #7
0
 private bool IsPlanar(Graph g)
 {
     Counter++;
     if (g.IsCompleteBipartite(3, 3) || g.IsComplete(5))
     {
         NonplanarSubgraph = g;
         return false;
     }
     if (g.Size == 5)
         return true;
     foreach (var edge in g.GetAllEdges())
     {
         var h = g.Shrink(edge.U, edge.V);
         var isPlanar = IsPlanar(h);
         if (!isPlanar)
         {
             ExtendNonplanarSubgraph(g, edge);
             return false;
         }
     }
     return true;
 }
예제 #8
0
 public PlanarityTestingAlgorithm(Graph inputGraph)
 {
     this.inputGraph = inputGraph;
 }
예제 #9
0
파일: Graph.cs 프로젝트: sokolowskip/WMH
 public Graph Shrink(int n, int m)
 {
     var h = new Graph();
     foreach (var v in AllVerticies.Where(x => x.Id != m))
     {
         h.AddVertex(v.Id);
     }
     foreach (var vertex in AllVerticies.Where(x => x.Id != m))
     {
         foreach (var neighbour in vertex.AllNeighbours.Where(x => x.Id != m))
         {
             h.AddDirectedEdge(vertex.Id, neighbour.Id);
         }
     }
     var mVertex = verticies[m];
     foreach (var neighbourOfM in mVertex.AllNeighbours.Where(x => x.Id != n))
     {
         h.AddUndirectedEdge(n, neighbourOfM.Id);
     }
     return h;
 }