Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с алгоритмом Прима, ошибка начальных результатов 
:(
    Опции темы
murzilka6002
  Дата 18.12.2011, 03:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 12.11.2011

Репутация: нет
Всего: нет



Есть алгоритм Прима построения дерева из графа. Считает всё правильно, но вывод начальных результатов не верный, не могу понять почему, должно всё правильно выдавать...а нет. 
Должен быть результат: 0 (0,1) 1 (1,2) 2 (2,8) 2 (2,5) 5 (5,6) 6 (6,7) 2 (2,3) 3 (3,4)
Код

#include <vector>
#include <queue>
#include <iostream>

using namespace std;

typedef pair<int, int> pii;                         //(B,величина ребра.)         
typedef vector<vector<pii> > Graph;                 //A(B,величина ребра.)


long long prim(Graph &g, vector<int> &pred)         //функцыя алгоритму
{
    int n = g.size();                               //розмір графу
    pred.assign(n, -1);                             //очистка вектора
    vector<bool> vis(n);
    vector<bool> vis_2(n);                              //
    vector<int> prio(n, INT_MAX);                   //створення вектору з кількістю величини графа 
                                                    //і присвоєння всім максимального числа INT_MAX (константа)
    prio[0] = 0;                                    //обнулення першого елементу
    priority_queue<pii, vector<pii> , greater<pii> > q; //контейнер сортуванння
    q.push(make_pair(0, 0));                            //добавка нульового елементу
    long long res = 0;                                  //вага дерева

    priority_queue<pii, vector<pii> , greater<pii> > po;
    po.push(make_pair(0, 0)); 

    cout<<"Szukame minimalne drzewo rozpinajace grafa z 9 wierzcholkow"<<endl;
    cout<<"V={0,1,2,3,4,5,6,7,8} i 14 krawedz"<<endl;
    cout<<"E="<<endl;
    cout<<"(a,b)={4}"<<endl;
    cout<<"(b,c)={8}"<<endl;
    cout<<"(c,d)={7}"<<endl;
    cout<<"(d,e)={9}"<<endl;
    cout<<"(e,f)={10}"<<endl;
    cout<<"(f,g)={2}"<<endl;
    cout<<"(g,h)={1}"<<endl;
    cout<<"(h,a)={8}"<<endl;
    cout<<"(h,i)={7}"<<endl;
    cout<<"(c,i)={2}"<<endl;
    cout<<"(g,i)={6}"<<endl;
    cout<<"(c,f)={4}"<<endl;
    cout<<"(d,f)={14}"<<endl;
    cout<<"(b,h)={11}"<<endl;
    cout<<endl;
    

    while (!q.empty())                               //Поки вектор не пустий
    {
       
        int d = q.top().first;                       //перший елемент перша пара вектора
        int u = q.top().second;                      //перший елемент друга пара вектора
        q.pop();                                     //видалення першого елементу вектора

        int pocz=po.top().second;
        po.pop();
        if (vis[u])
            continue;
        vis[u] = true;
        res += d;                                    //додавання ваги дерева
        for (int i = 0; i < (int) g[u].size(); i++)  //цикл для всіх звязків даного вузла
        {
            int v = g[u][i].first;                   //вузол першого сполучення
            if (vis[v])                              
                continue;
            int nprio = g[u][i].second;              //вага першого сполучення вузла
            if (prio[v] > nprio)                     //
            {
                prio[v] = nprio;                     //добавлення ваги першому сполученню дерева
                pred[v] = u;                         //добавлення до вектора другої пари вектора
                q.push(make_pair(nprio, v));         //добавлення нового елементу
                po.push(make_pair(nprio, u));
              
            }
        }

        if (u!=0)
        {
         cout<<pocz<<" ("<<pocz<<",";                 
         cout<<u<<") ";
        }
    }
    return res;
}

int main() {
    Graph g(9);
    g[0].push_back(make_pair(1, 4));
    g[0].push_back(make_pair(7, 8));    
    g[1].push_back(make_pair(0, 4));
    g[1].push_back(make_pair(2, 8));
    g[1].push_back(make_pair(7, 11));        
    g[2].push_back(make_pair(1, 8));
    g[2].push_back(make_pair(3, 7));
    g[2].push_back(make_pair(8, 2));   
    g[2].push_back(make_pair(5, 4));    
    g[3].push_back(make_pair(2, 7));
    g[3].push_back(make_pair(4, 9));
    g[3].push_back(make_pair(5, 14));      
    g[4].push_back(make_pair(3, 9));
    g[4].push_back(make_pair(5, 10));
    g[5].push_back(make_pair(4, 10));
    g[5].push_back(make_pair(6, 2));
    g[5].push_back(make_pair(2, 4)); 
    g[5].push_back(make_pair(3, 14));       
    g[6].push_back(make_pair(5, 2));
    g[6].push_back(make_pair(7, 1));
    g[6].push_back(make_pair(8, 6));    
    g[7].push_back(make_pair(6, 1));
    g[7].push_back(make_pair(8, 7));
    g[7].push_back(make_pair(1, 11)); 
    g[7].push_back(make_pair(0, 8));       
    g[8].push_back(make_pair(7, 7));
    g[8].push_back(make_pair(2, 2));
    g[8].push_back(make_pair(6, 6));
 
    vector<int> prio;
    long long res = prim(g, prio);
    cout<<"\nWaga minimalnego drzewa rozpinajacego rowna sie: "<<res<<endl;
    cout<<endl;

system("PAUSE");
return EXIT_SUCCESS;
}


Это сообщение отредактировал(а) murzilka6002 - 18.12.2011, 15:02
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0421 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.