Nadesłany przez Marcin Walewski, 11 maja 2013 17:31
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.Pobierz pełne rozwiązanie.
Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.
algorytm_prima.cpp:
//algorytm Prima
//www.algorytm.org
#include <iostream>
#include <stdio.h>
#include <string>
#define MX 10000 //bardzo duza liczba potrzebna do wag
using namespace std;
int main()
{
int graf[100][100]; // graf nad ktorym bedziemy pracowac
int odwiedzone[MX]; //tablica odwiedzonych
int waga[MX]; //tablica wag poszczegolnych polaczen
int nastepnik[MX]; // tablica nastepnych polaczen
int n , m; //n - liczba wierzkochlkow m - liczba krawedzi
int g; //liczba przypadk�w testowych
int a, b, c; // dane wejsciowe a- pierwszy wierzcholek, b- drugi wierzcholek, c - waga
int wiersz,wierzcholki,koszt,i;
printf( "Podaj liczbe przypadkow\n" );
scanf( "%d", &g); //pobieranie ilosci przypadkow
for(int z=0 ; z<g; z++) // glowna petla programu
{
printf( "Podaj liczbe wierzcholkow i krawedzi\n" );
scanf( "%d %d", &n, &m ); //pobieranie n(liczba wierzcholkow) i m(liczba krawedzi)
for(int e=0; e < n; e++ ) //inicjalizacja danych
{
nastepnik[e]=odwiedzone[e]=0; //nie ma poprzednikow i nastepnikow
waga[e]=MX; // waga jest rowna max
for(int r=0; r < n; r++ )
{
graf[e][r]=0; // wypelnianie tablicy zerami
}
}
for (int q=0; q < m; q++ ) //pobieranie drog w grafie
{
printf( "Podaj wierzcholki krawedzi i jej wage\n" );
scanf( "%d %d %d", &a, &b, &c ); //droga miedzy a i b o wadze c
graf[a][b]=graf[b][a]=c; //wypelnianie tablicy danymi uzytkownika
}
// inicjalizacja danych do algorytmu Prima
wiersz=1; //zaczynamy od pierwszego wiersza, czyli przeszukujemy wszystkie polaczenia pierwszego wierzcholka
waga[wiersz]=0; // pierwsza waga rowna jest zero
wierzcholki=1; //zaczynamy od pierwszech wierzcholka
odwiedzone[wiersz]=1; // pierwszy wierzcholek odwiedzilismy, bo zaczynamy od niego
//algorytm Prima
while(wierzcholki!=n) // n liczba wierzcholkow
{
for(i=0;i<n;i++)//przeszukanie pierwszego wiersza
{
if(graf[wiersz][i]!=0)//jezeli nie ma polaczenia z wierzcholkien to nie wchodz
{
if(odwiedzone[i]==0)// jezeli byl odiweczony to nie wchodz
{
if(waga[i]>graf[wiersz][i])// jezeli jest droga o mniejszym koszcie to nie wchodz
{
waga[i]=graf[wiersz][i]; // znaleziono najtansza droge, podmiana za wczesniejsza
}
}
}
}
koszt=MX; // maksymalny koszt
for(i=0;i<n;i++) // zanotowanie wagi w tabilcy
{
if(odwiedzone[i]==0) // sprawdzenie czy byl odwiedzony
{
if(waga[i]<koszt) // sprawdzenie czy waga jest nizsza od maxa
{
koszt=waga[i]; // ustawienie nowej wagi jako koszt
wiersz=i; // ustawienie wiersza w ktorym zmienilem wage
}
}
}
odwiedzone[wiersz]=1; // odwiedzony wierzcholek
wierzcholki++; // przechodzimy do nstepnego wierzcholka
}
koszt=0; //koszty na poczatku rowne zero
for(i=0;i<n;i++) // dodaje wagi
{
koszt+=waga[i]; //suma wag
}
cout<<koszt<<"\n"; //wypisanie an ekran
}
return 0;
}


1
6 9
0 1 4
1 2 2
0 4 1
1 4 2
2 3 8
4 3 3
3 5 6
5 4 7
0 5 2