Advertisement
SegaMegaPro

Бибииббибибобобобо

Dec 12th, 2022
39
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.70 KB | None | 0 0
  1. #include <iostream>
  2. using namespace std;
  3. #include<cstring>
  4. #include<math.h>
  5. int n;// Граф имеет всего n вершин
  6. int m;// выбрано m цветов
  7. int k;// В графе k ребер
  8. int sum=0;// Тип раскраски m графа
  9. int x[101];// Сохраняем текущую последовательность раскраски {...}
  10. int a[101][101];// Матрица смежности графа
  11. // Решаем, возможно ли раскрасить точку t как x [t]
  12. bool OK(int t)
  13. {
  14.   // Возможное условие - соседняя точка текущей точки не может быть того же цвета, что и она
  15.     for(int i=1;i<t;i++)
  16.         if(a[i][t]==1&&x[i]==x[t])
  17.             return false;
  18.   // Если все соседние точки не одного цвета
  19.     return true;
  20. }
  21. void getsum(int i)
  22. {
  23.     if(i>n){// i> n показывает, что допустимая схема раскраски найдена
  24.         sum++;// Количество схем раскраски ++
  25.         // Здесь можно выборочно вывести вектор решения
  26.         //for(int k=1;k<=n;k++)
  27.           //cout<<x[i]<<" ";
  28.         //cout<<endl;
  29.         return ;
  30.     }
  31.     // Листовой узел еще не достигнут, и текущий узел должен быть окрашен в допустимый цвет
  32.     else{
  33.         for(int k=1;k<=m;k++){  // Поддерево является м-арным деревом
  34.             x[i]=k;// Придаем i-й вершине k-й цвет
  35.             if(OK(i))
  36.                 getsum(i+1);
  37.             x[i]=0;// Если k-й цвет не подходит для i-й вершины
  38.             // Без окраски, легко следить за окраской
  39.         }
  40.     }
  41.     return ;// Если все цвета текущего узла невозможны, завершаем обход поддерева и возвращаем
  42. }
  43. int main()
  44. {
  45.     cin>>n>>k>>m;// Вводим количество фиксированных точек, количество сторон, количество типов окраски
  46.     int x,y;
  47.     memset(a,0,sizeof(a));// Присваиваем начальное значение матрице смежности
  48.     for(int i=1;i<=k;i++){
  49.         cin>>x>>y;
  50.         a[x][y]=a[y][x]=1;// Генерируем матрицу смежности
  51.     }
  52.     getsum(1);
  53.     cout<<sum;// Вывести максимально возможное количество схем раскраски, начальное значение суммы - 0
  54.     return 0;
  55. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement