Найти наибольшую клику в заданном орграфе, используя алгоритм нахождения независимых множеств - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Помогите написать программу в С. Найти наибольшую клику в заданном орграфе, используя алгоритм нахождения независимых множеств Сам метод: Клика Антиподом понятия независимого множества является понятие клики. Подмножество U вершин графа G называется кликой, если любые две входящие в него вершины смежны, т.е. если порожденный подграф G(U) является полным. Клика называется максимальной, если она не содержится в клике с большим числом вершин, и наибольшей, если число вершин в ней наибольшее среди всех клик. Число вершин в наибольшей клике графа G называется его плот-ностью (или кликовым числом) и обозначается через (G). Как и в случае независимых множеств, максимальная клика графа может оказаться не наибольшей. Понятие клики, в частности максимальной клики, используется в различных социологических теориях ( вопросы, связанные с голосованием, альянсами и т.п.), а также в теории игр. Очевидно следующее утверждение: подмножество вершин графа G является кликой тогда и только тогда, когда оно является независимым множеством в дополнительном графе G*. Вот то, что я начал писать:
Листинг программы
  1. #include <stdio.h>
  2. #include <conio.h>
  3. #define M 120
  4. int n, g[M][M], f[M][M];
  5. int main()
  6. {
  7. printf("Vvedite n= %d", n);
  8. for (int i = 0; i < n; i++)
  9. for (int j = 0; j < n; j++)
  10. printf("%d", g[i][j]);
  11. scanf("%d", &n);
  12. for (int i = 0; i < n; i++)
  13. for (int j = 0; j < n; j++)
  14. scanf("%d", &g[i][j]);
  15. for (int i = 0; i < n; i++)
  16. for (int j = 0; j < n; j++)
  17. if (g[i][j] == 0)
  18. g[i][j] = 1;
  19. else
  20. g[i][j] = 0;
  21. for (int i = 0; i < n; i++)
  22. for (int j = 0; j < n; j++)
  23. printf(" %d \n", g[i][j]);
  24. getch();
  25. return 0;
  26. }

Решение задачи: «Найти наибольшую клику в заданном орграфе, используя алгоритм нахождения независимых множеств»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <conio.h>
  3.  
  4. #define M 120
  5.  
  6. int n,g[M][M],Res[M], N_res, Q[M], i_end;
  7.  
  8. void rec(int ii, int N)
  9. {
  10.     int i, j;
  11.     if(N>N_res)
  12.     {
  13.         for(i=0; i<i_end; i++)
  14.             Res[i]=Q[i];
  15.         N_res=N;
  16.     }
  17.     if(ii==n)
  18.         return;
  19.     for(i=ii; i<n; i++)
  20.     {      
  21.         for(j=0; j<i_end; j++)
  22.             if(g[Q[j]][i]==0)
  23.                 break;
  24.         if(j==i_end)
  25.         {
  26.             Q[i_end++]=i;
  27.             rec(ii+1, N+1);
  28.             i_end--;
  29.         }
  30.         rec(ii+1, N);
  31.     }
  32. }
  33.  
  34. int main()
  35. {
  36.  printf("Vvedite n= ",n);
  37.  scanf("%d",&n);
  38.  int i;
  39.  for(i=0;i<n;i++)
  40.      for(int j=0;j<n;j++)
  41.          scanf("%d",&g[i][j]);   
  42. for(i=0;i<n;i++)
  43.     for(int j=0;j<n;j++)
  44.         if (g[i][j]==1) g[j][i]=1;
  45. for(i=0;i<n;i++)
  46. {
  47.     for(int j=0;j<n;j++)
  48.         printf(" %d",g[i][j]);
  49.     printf("\n");
  50. }
  51. for(i=0; i<n; i++)
  52. {
  53.     i_end=0;
  54.     rec(i, 0);
  55. }
  56. printf("Max klik:\n");
  57. for(i=0; i<N_res; i++)
  58.     printf("%d ", Res[i]);
  59. getch();
  60. return 0;
  61. }

Объяснение кода листинга программы

В этом коде реализован алгоритм поиска наибольшей независимой множества подмножеств, используя язык программирования C. Список действий, которые выполняются в коде:

  1. Ввод данных: Вводится значение переменной n, которое представляет собой количество вершин в графе. Затем, с помощью цикла, вводятся значения матрицы g, представляющей собой граф.
  2. Обработка графа: В этом блоке кода матрица g заполняется значениями, соответствующими верхней треугольной части матрицы. Это делается для удобства работы с алгоритмом поиска независимых множеств.
  3. Вывод матрицы g: С помощью цикла и функции printf выводятся значения матрицы g. Это делается для проверки входных данных.
  4. Реализация алгоритма поиска наибольшей независимой множества: Этот блок кода реализует рекурсивную функцию rec, которая ищет наибольшую независимую множества.
  5. Вывод результата: С помощью цикла и функции printf выводятся значения наибольшей независимой множества.
  6. Ввод-вывод: В этом блоке кода происходит ввод значения переменной n и вывод сообщения Max klik:.
  7. Завершение программы: Программа завершается с помощью функции getch, которая ожидает нажатия клавиши. Переменные, используемые в коде:
  8. n: Количество вершин в графе.
  9. g[i][j]: Значение (0 или 1) в матрице g, представляющей собой граф.
  10. Res[i]: Значение (вершина) из наибольшей независимой множества.
  11. N_res: Количество вершин в наибольшей независимой множества.
  12. Q[i]: Вершина, которую нужно рассмотреть в текущем подмножестве.
  13. i_end: Индекс последнего элемента в массиве Q.
  14. M: Размер матрицы g.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.5 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы