Пример #1
0
 public VertexWirth(int key, int count, VertexWirth next, EdgeWirth trail)
 {
     Key        = key;
     this.count = count;
     Next       = next;
     Trail      = trail;
 }
Пример #2
0
 public VertexWirth(int key, int count, VertexWirth next, EdgeWirth trail, object data = null)
 {
     Key        = key;
     this.count = count;
     Next       = next;
     Trail      = trail;
     Data       = data;
 }
Пример #3
0
 public bool AddVertex(int val, object data = null)
 {
     if (root != null)
     {
         root.GetEnd().Next = new VertexWirth(GetKey(), val, data);
     }
     else
     {
         root = new VertexWirth(GetKey(), val, data);
     }
     return(true);
 }
Пример #4
0
        private void DFS(VertexWirth vertex, ref List <int> visited)
        {
            visited.Add(vertex.Key);
            var trail = vertex.Trail;

            while (trail != null)
            {
                if (!visited.Contains(trail.Id.Key))
                {
                    DFS(trail.Id, ref visited);
                }
                trail = trail.Next;
            }
        }
Пример #5
0
        private bool DeleteDirectEdge(VertexWirth f, VertexWirth t)
        {
            EdgeWirth previous = null;
            var       edge     = f.Trail;

            while (edge != null)
            {
                if (edge.Id.Key == t.Key)
                {
                    if (!edge.Direct)
                    {
                        return(false);
                    }
                    var next = edge.Next;
                    if (previous == null)
                    {
                        if (next == null)
                        {
                            f.Trail = null;
                        }
                        else
                        {
                            f.Trail = next;
                        }
                    }
                    else
                    {
                        if (next == null)
                        {
                            previous.Next = null;
                        }
                        else
                        {
                            previous.Next = next;
                        }
                    }
                    return(true);
                }
                previous = edge;
                edge     = edge.Next;
            }
            return(false);
        }
Пример #6
0
        public bool AddVertex(int key, int val, object data = null)
        {
            var f = Find(key);

            if (f != null)
            {
                return(false);
            }
            RenewKey(key);
            if (root != null)
            {
                root.GetEnd().Next = new VertexWirth(key, val, data);
            }
            else
            {
                root = new VertexWirth(key, val, data);
            }
            return(true);
        }
Пример #7
0
 public EdgeWirth(VertexWirth id, EdgeWirth next, int weight, bool direct) : this(id, next, weight)
 {
     Direct = direct;
 }
Пример #8
0
 public EdgeWirth(VertexWirth id, EdgeWirth next, int weight) : this(id, next)
 {
     Weight = weight;
 }
Пример #9
0
 public EdgeWirth(VertexWirth id, int weight) : this(id)
 {
     Weight = weight;
 }
Пример #10
0
 public EdgeWirth(VertexWirth id, EdgeWirth next)
 {
     Id   = id;
     Next = next;
 }
Пример #11
0
 public EdgeWirth(VertexWirth id)
 {
     Id = id;
 }
Пример #12
0
 public GraphWirth(int key, int value)
 {
     root = new VertexWirth(key, value);
     RenewKey(key);
 }
Пример #13
0
        public bool DeleteVertex(int key)
        {
            if (root == null)
            {
                return(false);
            }

            var f = Find(key);//находим вершину, которую собираемся удалить

            if (f == null)
            {
                return(false);
            }

            VertexWirth previous = null; //предыдущая вершина
            var         edge     = root; //переменная для перебора вершин

            while (edge != null)         //ищем вершину в списке вершин
            {
                if (edge.Key == f.Key)   //нашли
                {
                    var r = root;
                    while (r.Next != null) //теперь убираем все ребра, которые ведут в эту вершину
                    {
                        var tmp = r.Trail; //идем по следу
                        while (tmp != null)
                        {
                            if (tmp.Id.Key == f.Key) //нашли ребро в удаляемую вершину
                            {
                                if (tmp.Direct)      //го его удалим
                                {
                                    DeleteDirectEdge(r.Key, f.Key);
                                }
                                else
                                {
                                    DeleteUndirectEdge(r.Key, f.Key);
                                }
                            }
                            tmp = tmp.Next;
                        }
                        r = r.Next;
                    }
                    var trail = f.Trail;
                    while (trail != null)//убираем ребра, ведущие из этой вершины (на всякий)
                    {
                        trail.Id = null;
                        var tmp = trail.Next;
                        trail.Next = null;
                        trail      = tmp;
                    }
                    var next = edge.Next; //ну и наконец удаляем ссылку на вершину из списка вершин
                    if (previous == null) //образовавшуюся дырочку (если есть) заштопаем
                    {
                        root = root.Next;
                    }
                    else
                    {
                        if (next != null)
                        {
                            previous.Next = next;
                        }
                        else
                        {
                            previous.Next = null;
                        }
                    }
                    return(true);//вы восхитительны
                }
                previous = edge;
                edge     = edge.Next;
            }
            return(false);//как
        }
Пример #14
0
 public GraphWirth(int value)
 {
     root = new VertexWirth(GetKey(), value);
 }
Пример #15
0
 public GraphWirth()
 {
     root = new VertexWirth(GetKey(), 0);
 }