Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _CRT_SECURE_NO_WARNINGS
- #include<iostream>
- using namespace std;
- int NV; // Количество вершин в графе
- int NE; // Количество ребер в графе
- #define MAX_NODES 100 // Максимальное количество вершин
- #define MAX_EDGES 10 // Максимальное количество ребер в графе
- struct edge_t {
- int n1, n2; // направление
- int w; // вес ребра
- } edges[MAX_EDGES]; // Ребра графа
- int nodes[MAX_NODES]; // Вершины графа. Значение - "верхняя вершина"
- int cmp(const void *a, const void *b) { // Функция "сравнения" двух ребер, используемая для сортировки
- edge_t *c = (edge_t*)a, *d = (edge_t*)b;
- return c->w - d->w;
- }
- int last_n;
- int getColor(int n) { // Функция получает цвет вершины n-й по порядку.
- int c; // если nodes[n] < 0, то вершина n имеет цвет nodes[n]
- if (nodes[n] < 0) // если nodes[n] >= 0, то вершина n имеет цвет такой же,
- return nodes[last_n = n]; // как и вершина с номером nodes[n]
- c = getColor(nodes[n]);
- nodes[n] = last_n;
- return c;
- }
- int controller(FILE *f)
- {
- int i;
- int weight = 0;
- fscanf(f, "%d %d", &NV, &NE);
- for (i = 0; i < NE; i++) nodes[i] = -1 - i;
- for (i = 0; i < NE; i++)
- fscanf(f, "%d %d %d", &edges[i].n1, &edges[i].n2, &edges[i].w);
- //==== Алгоритм Крускала===
- qsort(edges, NE, sizeof(edge_t), cmp);// Сортируем все ребра в порядке возрастания весов
- for (i = 0; i < NE; i++) { // пока не прошли все ребра
- int c2 = getColor(edges[i].n2);
- if (getColor(edges[i].n1) != c2) {
- // Если ребро соединяет вершины различных цветов-мы его добавляем
- // и перекрашиваем вершины
- nodes[last_n] = edges[i].n2;
- weight += edges[i].w;
- }
- }
- edges[0].w = 10000;
- return weight;
- }
- int main() {
- start:
- system("CLS");
- printf("Lab 10\n Graph algorithms\n Bershadskiy Andrew IS-81\n"); //меню
- printf("---------------Options---------------\n");
- printf("1. Read from text file\n");
- printf("2. Exit\n");
- printf("Choose your option: ");
- int switcher = 0; //переменная опции меню
- scanf("%d", &switcher);
- getchar();
- switch (switcher) //выбор опции из меню
- {
- case 1:{
- system("CLS");
- int i = 0;
- int weight1;
- int weight2;
- FILE * f = fopen("File.txt", "r"); // Считываем вход
- weight1 = controller(f);
- weight2 = controller(f);
- fclose(f);
- f = fopen("res.txt", "w");
- printf("Weight 1: %d\nWeight 2: %d\n", weight1, weight2);
- fprintf(f, "%d %d", weight1, weight2);
- system("pause");
- }
- goto start;
- case 2:{
- system("CLS");
- printf("Goodbye");
- getchar();
- exit(0);
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement