Advertisement
Guest User

lab 10

a guest
May 19th, 2019
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.18 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include<iostream>
  3. using namespace std;
  4. int NV;                 // Количество вершин в графе
  5. int NE;                 // Количество ребер в графе
  6.  
  7. #define MAX_NODES 100  // Максимальное количество вершин
  8. #define MAX_EDGES 10   // Максимальное количество ребер в графе
  9.  
  10. struct edge_t {
  11.     int n1, n2;  // направление
  12.     int w;      // вес ребра
  13. } edges[MAX_EDGES];  // Ребра графа
  14.  
  15. int nodes[MAX_NODES];  // Вершины графа.  Значение - "верхняя вершина"
  16.  
  17.  
  18. int cmp(const void *a, const void *b) {                             // Функция "сравнения" двух ребер, используемая для сортировки
  19.     edge_t *c = (edge_t*)a, *d = (edge_t*)b;
  20.     return c->w - d->w;
  21. }
  22.  
  23. int last_n;
  24.  
  25.  
  26.  
  27.  
  28.  
  29. int getColor(int n) {                                               // Функция получает цвет вершины n-й по порядку.
  30.     int c;                                                          // если nodes[n] < 0, то вершина n имеет цвет nodes[n]
  31.     if (nodes[n] < 0)                                               // если nodes[n] >= 0, то вершина n имеет цвет такой же,
  32.         return nodes[last_n = n];                                   // как и вершина с номером nodes[n]
  33.     c = getColor(nodes[n]);
  34.     nodes[n] = last_n;
  35.     return c;
  36. }
  37.  
  38. int controller(FILE *f)
  39. {
  40.     int i;
  41.     int weight = 0;
  42.     fscanf(f, "%d %d", &NV, &NE);
  43.     for (i = 0; i < NE; i++) nodes[i] = -1 - i;
  44.  
  45.     for (i = 0; i < NE; i++)
  46.         fscanf(f, "%d %d %d", &edges[i].n1, &edges[i].n2, &edges[i].w);
  47.  
  48.     //==== Алгоритм Крускала===
  49.  
  50.     qsort(edges, NE, sizeof(edge_t), cmp);// Сортируем все ребра в порядке возрастания весов
  51.  
  52.     for (i = 0; i < NE; i++) { // пока не прошли все ребра
  53.         int c2 = getColor(edges[i].n2);
  54.         if (getColor(edges[i].n1) != c2) {
  55.             // Если ребро соединяет вершины различных цветов-мы его добавляем
  56.             // и перекрашиваем вершины
  57.             nodes[last_n] = edges[i].n2;
  58.             weight += edges[i].w;
  59.         }
  60.     }
  61.     edges[0].w = 10000;
  62.     return weight;
  63. }
  64.  
  65. int main() {
  66. start:
  67.     system("CLS");
  68.     printf("Lab 10\n Graph algorithms\n Bershadskiy Andrew IS-81\n"); //меню
  69.     printf("---------------Options---------------\n");
  70.     printf("1. Read from text file\n");
  71.     printf("2. Exit\n");
  72.     printf("Choose your option: ");
  73.     int switcher = 0;                                //переменная опции меню
  74.     scanf("%d", &switcher);
  75.     getchar();
  76.     switch (switcher)                                   //выбор опции из меню
  77.     {
  78.     case 1:{
  79.                system("CLS");
  80.                int i = 0;
  81.                int weight1;
  82.                int weight2;
  83.                FILE * f = fopen("File.txt", "r"); // Считываем вход
  84.                weight1 = controller(f);
  85.                weight2 = controller(f);
  86.                fclose(f);
  87.                f = fopen("res.txt", "w");
  88.                printf("Weight 1: %d\nWeight 2: %d\n", weight1, weight2);
  89.                fprintf(f, "%d %d", weight1, weight2);
  90.                system("pause");
  91.     }
  92.         goto start;
  93.     case 2:{
  94.                system("CLS");
  95.                printf("Goodbye");
  96.                getchar();
  97.                exit(0);
  98.     }
  99.     }
  100.     return 0;
  101. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement