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]); }
//проверка на однотонность. //СУТЬ: составляем список всевозможных маршрутов в графе. Для каждого запоминаем точки, через которые он проходит //и цвета его линий 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; } }