algorytm.org

Implementacja w C/C++



Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

Algorytm Prima - Implementacja w C/C++
Ocena użytkownikóww: *****  / 28
SłabyŚwietny
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;
}
Komentarze
photo
0 # Tomasz Lubiński 2013-05-15 07:19
Wejście do programu dla przykładu z artykułu:
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
Odpowiedz | Odpowiedz z cytatem | Cytować
photo
-1 # $,$ 2016-09-29 20:41
Czemu używasz i printf i cout
Odpowiedz | Odpowiedz z cytatem | Cytować
Dodaj komentarz