Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- #include <locale>
- using namespace std;
- struct edge
- {
- int u, v, w;
- };
- edge *e;
- int* p;
- int* b;
- void qsort(int l, int r)
- {
- int i = l; int j = r;
- int mid = e[(i + j) / 2].w;
- do
- {
- while (e[i].w<mid) i++;
- while (e[j].w>mid) j--;
- if (i <= j)
- {
- edge buf = e[i];
- e[i] = e[j];
- e[j] = buf;
- i++;
- j--;
- }
- } while (i <= j);
- if (i<r) qsort(i, r);
- if (j>l) qsort(l, j);
- }
- int findset(int x)
- {
- if (x != p[x]) p[x] = findset(p[x]);
- return p[x];
- }
- void un(int x, int y)
- {
- x = findset(x); y = findset(y);
- if (b[x]>b[y]) p[y] = x; else p[x] = y;
- if (b[x] == b[y]) b[y]++;
- }
- int main()
- {
- int d, i, j, q = 0;
- ifstream f("ishod.txt", ios::in);
- ofstream F("EdgeTemp.txt");
- f >> d;
- int** massive = new int*[d];
- for (i = 0; i < d; i++){
- massive[i] = new int[d];
- }
- for (i = 0; i < d; i++){ //Считывание матрицы
- for (j = 0; j < d; j++){
- string s;
- f >> s;
- if (s == "~") massive[i][j] = -1;
- else massive[i][j] = atoi(s.c_str());
- }
- }
- for (i = 0; i < d; i++){ // Счёт кол-ва рёбер в графе
- for (j = i + 1; j < d; j++){
- if (massive[i][j] != -1){
- q++;
- }
- }
- }
- f.close();
- F << d << " " << q << endl; // d - вершины , q - рёбра
- F.close();
- F.open("EdgeTemp.txt", ios::app);
- for (i = 0; i < d; i++){
- for (j = i + 1; j < d; j++){
- if (massive[i][j] != -1){
- F << i + 1 << " " << j + 1 << " " << massive[i][j] << endl; //Запись в файл в виде (точка1,точка2,длина)
- }
- }
- }
- F.close();
- ifstream f("EdgeTemp.txt", ios::in);
- setlocale(LC_ALL, "RUS");
- int m, n;
- cout<<"Введите кол-во вершин в графе\n";
- f>>m;
- e = new edge[m];
- cout<<"Введите кол-во ребер в графе\n";
- f>>n;
- p = new int[n];
- b = new int[n];
- for (int i = 0; i<m; i++) //Заполняем массив ребёр
- {
- f>>e[i].u;
- f>>e[i].v;
- f>>e[i].w;
- }
- qsort(0, m - 1); // Сортировка
- for (int i = 0; i<n; i++)
- {
- p[i] = i;
- b[i] = 0;
- }
- for (int i = 0; i<m; i++)
- if (findset(e[i].u) != findset(e[i].v)) //Проверка на связность
- {
- un(e[i].u, e[i].v);
- cout<<e[i].u<<" "<<e[i].v<<" ";
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment