Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- using namespace std;
- #include<cstring>
- #include<math.h>
- int n;// Граф имеет всего n вершин
- int m;// выбрано m цветов
- int k;// В графе k ребер
- int sum=0;// Тип раскраски m графа
- int x[101];// Сохраняем текущую последовательность раскраски {...}
- int a[101][101];// Матрица смежности графа
- // Решаем, возможно ли раскрасить точку t как x [t]
- bool OK(int t)
- {
- // Возможное условие - соседняя точка текущей точки не может быть того же цвета, что и она
- for(int i=1;i<t;i++)
- if(a[i][t]==1&&x[i]==x[t])
- return false;
- // Если все соседние точки не одного цвета
- return true;
- }
- void getsum(int i)
- {
- if(i>n){// i> n показывает, что допустимая схема раскраски найдена
- sum++;// Количество схем раскраски ++
- // Здесь можно выборочно вывести вектор решения
- //for(int k=1;k<=n;k++)
- //cout<<x[i]<<" ";
- //cout<<endl;
- return ;
- }
- // Листовой узел еще не достигнут, и текущий узел должен быть окрашен в допустимый цвет
- else{
- for(int k=1;k<=m;k++){ // Поддерево является м-арным деревом
- x[i]=k;// Придаем i-й вершине k-й цвет
- if(OK(i))
- getsum(i+1);
- x[i]=0;// Если k-й цвет не подходит для i-й вершины
- // Без окраски, легко следить за окраской
- }
- }
- return ;// Если все цвета текущего узла невозможны, завершаем обход поддерева и возвращаем
- }
- int main()
- {
- cin>>n>>k>>m;// Вводим количество фиксированных точек, количество сторон, количество типов окраски
- int x,y;
- memset(a,0,sizeof(a));// Присваиваем начальное значение матрице смежности
- for(int i=1;i<=k;i++){
- cin>>x>>y;
- a[x][y]=a[y][x]=1;// Генерируем матрицу смежности
- }
- getsum(1);
- cout<<sum;// Вывести максимально возможное количество схем раскраски, начальное значение суммы - 0
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement