Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.12.2011, 13:41   #1
murzilka6002
Пользователь
 
Регистрация: 11.11.2011
Сообщений: 20
Вопрос Проблема с алгоритмом Прима, ошибка начальных результатов

Есть алгоритм Прима построения дерева из графа. Считает всё правильно, но вывод начальных результатов не верный, не могу понять почему, должно всё правильно выдавать...а нет.
Должен быть результат: 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 в 16:03.
murzilka6002 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с алгоритмом... Petrum Общие вопросы C/C++ 4 23.11.2011 22:14
проблема с алгоритмом hunter03 Помощь студентам 2 30.10.2011 11:26
Проблема с Алгоритмом!!!! sir.andrey Помощь студентам 1 06.11.2010 11:14
Ошибка с алгоритмом Sort Progsenya Visual C++ 9 08.09.2010 18:37