コード例 #1
0
ファイル: Class1.cs プロジェクト: sskhaustov/Graph_cs
 public Class1(Class1 _other)
 {
     path = new List<int>();
     path_color = new List<_Color>();
     for (int i = 0; i < _other.path.Count; i++)
         path.Add(_other.path[i]);
     for (int i = 0; i < _other.path_color.Count; i++)
         path_color.Add(_other.path_color[i]);
 }
コード例 #2
0
ファイル: Form1.cs プロジェクト: sskhaustov/Graph_cs
        //проверка на однотонность.
        //СУТЬ: составляем список всевозможных маршрутов в графе. Для каждого запоминаем точки, через которые он проходит
        //и цвета его линий
        private void get_all_ways()
        {
            //сначала составляем предварительный список из маршрутов, в которых всего 2 точки - потом из них будут составлены
            //болеее сложные маршруты
            int cnt = 0;
                for (int i = 0; i < num_of_vertex - 1; i++)
                    for (int j = 0; j < num_of_vertex; j++)
                        //1 в матрице означает, что между точками есть путь
                        if (graf[i, j] == 1)
                        {
                            Class1 sf = new Class1();
                            //запоминает начальную и конечную точки и цвет линии
                            sf.path.Add(i);
                            sf.path.Add(j);
                            sf.path_color.Add(mas_line[cnt++].color);
                            mas_path.Add(sf);
                        }
            //далее добавляем маршруты, состаящие из 3-х и более точек. Для этого сравниваем полученные простые маршруты
            //друг с другом (обход списка начинаем с конца, идем до первого просмотренного), и если начальная точка одного из них равна конечной точке другого,
            //то создаем из них новый маршрут и добавляем в список
            //
            //так продолжаем до тех пор, пока все маршруты не будут получены
            bool flag = false;
            int oldlen = 0, step = 1;
            while (!flag)
            {
                flag = true; //предполагаем, что маршрутов ббольше нет
                cnt = 0;
                int len = mas_path.Count - 1; //фиксируем длину, т.к. в процессе она может измениться
                //идем от конца списка до первого проверенного элемента, сравниваем эти элементы со всеми в массиве
                for (int i = len; i > oldlen; i--)
                    for (int j = len - 1; j >= 0; j--)
                        //если совпали начальная и конечная точки
                        if (mas_path[i].path[0] == mas_path[j].path[mas_path[j].path.Count - 1])
                        {
                            Class1 sf = new Class1(mas_path[j]);
                            //то добаляем к найденному маршруту те точки, которых в нем нет, и которые есть в конечном
                            for (int _k = mas_path[i].path.Count - step; _k < mas_path[i].path.Count; _k++)
                            {
                                sf.path.Add(mas_path[i].path[_k]);
                                //аналогично с цветами
                                sf.path_color.Add(mas_path[i].path_color[_k - 1]);
                                //MessageBox.Show(_k.ToString(), "DeadCheck");
                            }
                            mas_path.Add(sf);
                            flag = false; //маршрут добавлен
                            cnt++; //число новых добавленных (непроверенных)
                        }
                oldlen = mas_path.Count - cnt - 1; //определяем позицию крайнего проверенного элемента - чтобы
                //не добавить один и тот же маршрут 2 раза
                step++;
            }
            //MessageBox.Show(mas_path.Count.ToString(), "DeadCheck");
            //далее определяем расцветку. Если все цвета в маршруте синие, то значение расцветки будет 1, для красных - 2
            //если разные, то 0
            for (int i = 0; i < mas_path.Count; i++)
            {
                _Color oldcolor = mas_path[i].path_color[0];
                int j = 0;
                while (j < mas_path[i].path_color.Count && mas_path[i].path_color[j] == oldcolor)
                {
                    oldcolor = mas_path[i].path_color[j];
                    j++;
                }
                if (j >= mas_path[i].path_color.Count)
                    switch (oldcolor)
                    {
                        case _Color.BLUE:
                            mas_path[i].colored = 1;
                            break;
                        case _Color.RED:
                            mas_path[i].colored = 2;
                            break;
                    }
                else
                    mas_path[i].colored = 0;

            }
        }