/// <summary>
        /// Сохраняет топологию в .xml файл
        /// </summary>
        /// <param name="fileName">Путь к файлу</param>
        /// <param name="net">Сохраняемая топология</param>
        public void SaveTopology(String fileName, Topology net)
        {
            XDocument xDoc = new XDocument();
            // Создаем корень документа
            XElement xRoot = new XElement("Topology");
            // Создаем список маршрутизаторов
            XElement xRouters = new XElement("Routers");
            // Создаем список каналов
            XElement xLinks = new XElement("Links");

            xRoot.Add(xRouters);
            xRoot.Add(xLinks);
            xDoc.Add(xRoot);

            /* Запись узлов */
            foreach (Router r in net.Routers)
            {
                XElement xRouter = new XElement("Router");
                XAttribute xName = new XAttribute("name", r.Name);
                XAttribute xLocationX = new XAttribute("x", r.Location.X.ToString());
                XAttribute xLocationY = new XAttribute("y", r.Location.Y.ToString());

                xRouter.Add(xName);
                xRouter.Add(xLocationX);
                xRouter.Add(xLocationY);

                xRouters.Add(xRouter);
            }
            /* Запись ребер */
            foreach (Link l in net.Links)
            {
                XElement xLink = new XElement("Link");
                XAttribute xMetric = new XAttribute("metric", l.Metric.ToString());
                XAttribute xIndexS = new XAttribute("snode", l.NumS.ToString());
                XAttribute xIndexE = new XAttribute("enode", l.NumE.ToString());

                xLink.Add(xMetric);
                xLink.Add(xIndexS);
                xLink.Add(xIndexE);

                xLinks.Add(xLink);
            }

            xDoc.Save(fileName);
        }
        /// <summary>
        /// Загружает топологию из .xml файла
        /// </summary>
        /// <param name="fileName">Путь к файлу</param>
        /// <param name="net">Сохраняемая топология</param>
        public void LoadTopology(String fileName, Topology net)
        {
            XDocument xDoc = XDocument.Load(fileName);
            net.Clear();

            /* Загрузка узлов */
            foreach (XElement r in xDoc.Root.Element("Routers").Elements())
            {
                Router router = new Router(new Point(Int32.Parse(r.Attribute("x").Value),
                                                     Int32.Parse(r.Attribute("y").Value)),
                                           Drawing.RouterImg);
                router.Name = r.Attribute("name").Value;
                net.CreateNode(router);
            }
            /* Загрузка ребер */
            foreach (XElement l in xDoc.Root.Elements("Links").Elements())
            {
                Link link = new Link(Int32.Parse(l.Attribute("snode").Value),
                                     Int32.Parse(l.Attribute("enode").Value));
                link.Metric = Int32.Parse(l.Attribute("metric").Value);
                net.CreateEdge(link);
            }
        }
        /// <summary>
        /// Вычисляет постоянные пометки вершин с
        /// помощю классического алгоритма Дейкстры
        /// в несегментированном графе
        /// </summary>
        /// <param name="net">Сетевая топология</param>
        /// <param name="indexV">Индекс корня</param>
        public void Process(Topology net, Int32 indRoot)
        {
            InitGraph(net);

            _vertexes[indRoot].Mark = 0;
            Vertex tmpVertex = _vertexes[indRoot];

            /* Просмотр вершин */
            for (Int32 i = 0; i < _vertexes.Count; i++)
            {
                /* Назначение временных меток соседям */
                for (Int32 j = 0; j < tmpVertex.Adjacent.Count; j++)
                {
                    Int32 newMark = tmpVertex.Mark + tmpVertex.Metric[j];
                    if (tmpVertex.Adjacent[j].Used == false &&
                        newMark < tmpVertex.Adjacent[j].Mark)
                    {
                        tmpVertex.Adjacent[j].Mark = newMark;
                    }
                }
                tmpVertex.Used = true;

                /* Поиск следующей вершины для просмотра */
                Int32 min = _INF;
                for (Int32 j = 0; j < _vertexes.Count; j++)
                {
                    if (_vertexes[j].Used == false &&
                        _vertexes[j].Mark < min)
                    {
                        min = _vertexes[j].Mark;
                        tmpVertex = _vertexes[j];
                    }
                }
            }

            FormConstMarks();
        }
 /// <summary>
 /// Инициализирует граф
 /// </summary>
 /// <param name="net">Сетевая топология</param>
 protected abstract void InitGraph(Topology net);
 /// <summary>
 /// Инициализирует граф
 /// </summary>
 /// <param name="net">Сетевая топология</param>
 protected override void InitGraph(Topology net)
 {
     /* Установка исходных данных */
     _vertexes = new Vertex[net.Routers.Count];
     for (Int32 i = 0; i < _vertexes.Count; i++)
     {
         _vertexes[i] = new Vertex();
         _vertexes[i].Used = false;
         _vertexes[i].Mark = _INF;
     }
     /* Формирование смежных списков */
     foreach (Link l in net.Links)
     {
         Int32 sIndex = l.NumS;
         Int32 eIndex = l.NumE;
         _vertexes[sIndex].Adjacent.Add(_vertexes[eIndex]);
         _vertexes[sIndex].Metric.Add(l.Metric);
         _vertexes[eIndex].Adjacent.Add(_vertexes[sIndex]);
         _vertexes[eIndex].Metric.Add(l.Metric);
     }
 }
 /// <summary>
 /// Конструктор
 /// </summary>
 /// <param name="net">Сетевая топология</param>
 public RoutingTableFiller(Topology net)
 {
     _net = net;
 }
 /// <summary>
 /// Конструктор
 /// </summary>
 /// <param name="net">Сетевая топология</param>
 public RoutingTableFillerForm(Topology net)
 {
     InitializeComponent();
     _net = net;
 }
 /// <summary>
 /// Конструктор
 /// </summary>
 /// <param name="net">Сетевая топология</param>
 public DispatchAllForm(Topology net)
 {
     InitializeComponent();
     _net = net;
 }
 /// <summary>
 /// Конструктор
 /// </summary>
 /// <param name="net">Сетевая топология</param>
 public AlgDejkstraForm(Topology net)
 {
     InitializeComponent();
     _net = net;
 }