• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Помогите изменить алгоритм

  • Автор темы Автор темы sidjey
  • Дата начала Дата начала

sidjey

Новые
Регистрация
24 Фев 2011
Сообщения
25
Реакции
0
Баллы
0
Помогите изменить алгоритм

в общем есть программа которая находит минимальное остовное дерево с помощью алгоритма Прима, помогите пожалуйста изменить алгоритм Прима на алгоритм Крускала

Код:
#include <stdlib.h>
#include <iostream>
#include <string.h>
#include <vector>
#include <windows.h>
#include <iomanip>

using namespace std;

struct branch
{
int s;
int e;
int w;
void clear()
{
s=0,e=0,w=0;
}
};

//Функция проверки графа на связность
int isconnected(vector < vector <int> > matrix)
{
    int s = matrix.size(), i=0, j=0, k=0, got=0;
    int * n=new int[s];
    for (i=0; i<s; i++)
    n[i]=0;
    n[0]=1;
    i=0;
    do
    {
    got = 0;
    i++;
    for(j=0;j<s;j++)
        if(n[j]==i)
            for(k=0;k<s;k++)
                if(matrix[j][k]&&!n[k])
                    {
                    got++;
                    n[k]=i+1;
                    }
    }while(got);
    for (i=0; i<s; i++)
        if (!n[i])
            {
             delete[] n;
             return 0;
            }
    delete[] n;
    return 1;
}

//функция для поиска минимального дерева. Результат возвращается в массиве.
vector <branch> tree(vector <vector <int> > weight)
{
    int s = weight.size(), i=0, j=0, k=0, occ=0;
    int * n=new int[s];
    for (i=0; i<s; i++)
        n[i]=0;
    vector<branch> result;
    branch tmp;
    tmp.w = 0;
    //Выбираем наименьшее ребро графа как первую ветвь дерева.
    for(i=0;i<s;i++)
        for(j=i+1;j<s;j++)
            if (weight[i][j]&&((weight[i][j]<tmp.w)||!tmp.w))
                {
                tmp.w = weight[i][j];
                tmp.s=i;
                tmp.e=j;
                }
    result.push_back(tmp);
    //выбрали, сохранили
    n[tmp.s]=1;
    n[tmp.e]=1;
    occ=2;
    //n - массив использованных вершин
    while(occ<s)
    {
    tmp.clear();
    for(i=0;i<s;i++)
        if (n[i]!=0)//Ищем минимальное ребро среди тех, которые образуют дерево при прибавлении к текущему.
            for (j=0;j<s;j++)//Проходимся по вершинам, которые уже в дереве, и ищем ребро, соединённое с ними
               if (weight[i][j]&&((weight[i][j]<tmp.w)||!tmp.w)&&!n[j])
                {
                tmp.w = weight[i][j];
                tmp.s=i;
                tmp.e=j;
                }
    result.push_back(tmp);
    n[tmp.e]=1;
    occ++;
    }
    delete[] n;
    return result;
}

//Подготовка кириллической строки для печать в консоли
string cyr(string str)
{
    char * temp;
    temp=new char[str.size()+1];
    strcpy(temp, str.c_str());
    CharToOem(temp,temp);
    string result = temp;
    delete[] temp;
    return result;
}


int main (void)
{
    string str;
    vector <int> tmpvec;
    vector<branch> tr;
    int n, i, j;
    cout << cyr("Введите количество вершин: ") << endl;
    cin >> n;
    if(n<2)
        {
        cout << cyr("Минимального остовного дерева не существует") << endl;
        system("pause");
        return 0;
        }
    vector <vector <int> > weight(n); //матрица сопряжённости
    cout << cyr("Введите вес ребра между вершинами:")<<endl;
    for (i=0; i<n;i++)
        weight[i].assign(n,0);
    for (i=0;i<n;i++)
        for(j=i;j<n;j++)
            {
             do
             {
             cout<< i+1 << '-' << j+1 << ": ";
             cin >> weight[i][j];
             weight[j][i]=weight[i][j];
             if(weight[i][j]<0) cout << cyr("Неверное значение, повторите ввод:") <<endl;
             }
             while(weight[i][j]<0);
            }
    if (!isconnected(weight))
        {
        cout << cyr("Граф несвязный!")<< endl;
        }
    else
        {
        //если все проверки выполнены, заполняем вектор tr
        tr = tree(weight);
        cout << endl << cyr("Мин. остовное дерево:")<< endl;
        //выводим минимальное остовное дерево в виде таблицы
        cout << cyr("Начало|Конец|Вес")  << endl <<"------|-----|---" <<endl;
        for(i=0;i<tr.size();i++)
            cout << setw(6)<< tr[i].s+1 << "|" << setw(5)<< tr[i].e+1 << "|" << setw(3)<< tr[i].w << endl;
        system("pause");
        return 0;
        }
    system("pause");
    return 1;
}
 
Назад
Сверху