Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Diskret / Graf_paint / main

.cpp
Скачиваний:
5
Добавлен:
18.08.2019
Размер:
6.64 Кб
Скачать
#include <iostream>
using namespace std;

bool Graf[9][9] = {{0,1,0,0,1,0,0,0,0},//0
                  {1,0,1,1,1,0,0,0,0},//1
                  {0,1,0,1,0,1,0,1,0},//2
                  {0,1,1,0,1,1,1,0,0},//3
                  {1,1,0,1,0,0,1,0,0},//4
                  {0,0,1,1,0,0,1,1,1},//5
                  {0,0,0,1,1,1,0,0,1},//6
                  {0,0,1,0,0,1,0,0,1},//7
                  {0,0,0,0,0,1,1,1,0}};//8
//количество смежных нераскрашенных
int unpaint_incident(int *C, int n, int b)//массив цветов//его размер//номер вершины
{
    int i,k=0;
    for (i = 0; i < n; i++)
        if(Graf[b][i] && !C[i])//поиск количества смежных и нераскрашенных
            k++; //cout << "------"<< k << endl;
    return k;
}

void bubble(int P[], int B[], int C[], int n)
{
    int i,j;
    for (i = 1; i < n; i++)
    for (j = 0; j<n-i; j++)
       // if (P[j] < P[j + 1])
        if ((P[j] < P[j + 1]) || (unpaint_incident(C,n,B[j]) < unpaint_incident(C,n,B[j+1])))
            {
            P[j] ^= P[j+1];//перестановка степеней вместе с вершинами
            B[j] ^= B[j+1];
            P[j+1] ^= P[j];
            B[j+1] ^= B[j];
            P[j] ^= P[j+1];
            B[j] ^= B[j+1];
            }
}

int iDel(int *arrayX, int *arrayY, int lenAr, int nom)//функция удаления элемента из массивов
{
    int i;
    if((nom<lenAr)&&(nom>=0))//если номер удаляемого элемента не входит в размер массива сообщаем об ошибке
    {
    for(i=nom;i<lenAr-1;i++)
        {
        arrayX[i] = arrayX[i+1];//двигаем весь массив
        arrayY[i] = arrayY[i+1];
        }
    lenAr--;//уменьшаем размер массива
    }
else cout << "error" << endl;//ошибка удаления

    return lenAr;
}

int cutter(int *B, int *P, int *C, int c, int k, int j, int N)//вершины//степени//цвета//цвет//в-на для кот ищется смежные//ж//Н
{
if(j < N)//условие выхода из рекурсии
    {
    if(Graf[k][B[j]] ^ 1)
        {
            //cout << j << " " << Graf[k][B[j]]<<B[j] << endl;
            C[B[j]] = c;//раскраска
            N = iDel(B,P,N,j);// и удаление
            N = cutter(B, P, C, c, k, j, N);//заново не меняя номер
        }
    else
        {
            j++;//следующая вершина
            N = cutter(B, P, C, c, k, j, N);
        }

    }
return N;//количество нераскрашенных вершин
}

int main()
{  int *Bypass;//массив вершин
   int *Powers;// ... степеней
   int *Colour;// ..... цветов
   int i, j, c;
   int N, Nvar;

N = 9;// количество вершин в графе N

Bypass = new int [N];
Powers = new int [N];
Colour = new int [N];

for (i = 0; i < N; i++)
    {
        Bypass[i] = i;
        Powers[i] = 0;
        Colour[i] = 0;
    }


for (i = 0; i < N; i++)
    for (j = 0; j < N; j++)
        Powers[i] += Graf[i][j];//степени = количествам смежных вершин

for(i=0;i<N;i++)
{
    for(j=0;j<N;j++)
        cout << Graf[i][j] << " ";
cout << endl;
}

c = 0;
Nvar = N;

cout << endl;
for(j=0;j<Nvar;j++) cout << Bypass[j] << " " ; cout << "Bypass" << endl;
for(j=0;j<Nvar;j++) cout << Powers[j] << " " ; cout << "Powers" << endl;
for(j=0;j<N   ;j++) cout << Colour[j] << " " ; cout << "Colors" << endl;

while(Nvar > 0)
{
    bubble (Powers,Bypass,Colour,Nvar);
    c++;//новый цвет
    Nvar = cutter(Bypass, Powers, Colour, c, Bypass[0], 0, Nvar);

    cout << endl;
    for(j=0;j<Nvar;j++) cout << Bypass[j] << " " ; cout << "Bypass" << endl;
    for(j=0;j<Nvar;j++) cout << Powers[j] << " " ; cout << "Powers" << endl;
    for(j=0;j<N   ;j++) cout << Colour[j] << " " ; cout << "Colors" << endl;
}

cin.get();
delete[] Bypass;
delete[] Powers;
delete[] Colour;
return 0;
}
/*
Алгоритм неявного перебора
Для определения хроматического числа графа может быть использован достаточно эффективно простой метод неявного перебора.
Предположим, что множество вершин как-то упорядочено и xi — i-я вершина этого множества.
Тогда первоначальная допустимая раскраска может быть получена так:
Окрасить xi в цвет 1.
Каждую из оставшихся вершин окрашивать последовательно: вершина xi окрашивается в цвет
с наименьшим возможным «номером» (т. е. выбираемый цвет должен быть первым в данном
упорядочении цветом, не использованным при окраске какой-либо вершины, инцидентной xi).
Далее улучшаем раскраску. Отыскиваем первую по номеру вершину с максимальным цветом. Из неё делаем шаг возвращения:
Находим смежную вершину с максимальным номером, который меньше, чем у нее.
Пытаемся перекрасить её в цвет больший собственного, но меньший, чем максимальный цвет в графе.
Если это не удается, то делаешь шаг возвращения из этой вершины.
Если это удаётся, то по правилу первой фазы перекрашиваем вершины с большим номером.
Если при перекрашивании какая-то вершина затребовала максимальный цвет, от которого мы пытаемся избавиться, то делаем шаг возвращения из неё.
Если достигнута первая вершина, то завершаем работу.
Пример (Неявный перебор) В качестве примера возьмём граф, представленный на рисунке 1:
Цвета обозначим:
Красный – 1;
Зеленый – 2;
Синий – 3;
Раскрашиваем вершины по порядку в минимально возможные цвета: 1 -красный, 2 - зеленый, 3 - зеленый, 4 - красный, 5 - синий.
Вершина номер 5 имеет максимальный цвет (с номером 3). Попытаемся от него избавиться: делаем шаг возвращения из вершины 5.
Смежная вершина с максимальным номером, которая меньше 5 - это 3.
Перекрасить ее в цвет больший ее (2) и меньший, чем максимальный (3) - нельзя. Делаем шаг возвращения из вершины 3.
Смежная вершина с максимальным номером, которая меньше 3 - это 1. Мы достигли первую вершину и завершаем алгоритм.
Приближенные алгоритмы раскрашивания
///Эвристический метод
Вначале выбираем первый цвет.
Сортируем вершины по количеству неокрашенных смежных вершин.
Последовательно окрашиваем вершины в выбранный цвет.
Если у вершины уже есть смежная вершины с выбранный цветом, то оставляем ее неокрашенной.
Если остались неокрашенные вершины, то выбираем следующий цвет и переходим к пункту 1.
///Пример. Эвристический метод.
Сортируем вершины по степени: 1, 3, 2, 4, 5.
Окрашиваем в первый цвет (красный). Мы можем окрасить вершины 1.
Вершины 2 и 3 окрасить нельзя, поскольку они смежны с 1. Вершина 4 несмежна, так что может быть окрашена в красный.
Смежную с первой вершину 5 окрасить нельзя.
Сортируем вершины по количеству смежных неокрашенных вершин: 3, 2, 5.
Выбираем следующий цвет - зеленый. Мы можем окрасить в него вершины 2 и 3.
Сортируем вершины по количеству смежных неокрашенных вершин: остаётся только 5.
Выбираем следующий цвет - синий (3).
Окрашиваем последую вершину 5 в синий цвет.
*/
Соседние файлы в папке Graf_paint
  • #
    18.08.20191.12 Кб5Graf_paint.cbp
  • #
    18.08.2019104 б6Graf_paint.depend
  • #
    18.08.2019324 б6Graf_paint.layout
  • #
    18.08.20196.64 Кб5main.cpp