Nadesłany przez Michał Knasiecki, 09 sierpnia 2005 01:00
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.
droga_c/Droga.cpp:
/********************************************************************************
* *
* Algorytm konstrukcji drogi między dwoma wierzchołkami o zadanej długości*
* Plik pobrany ze strony: www.algorytm.org *
* Opracowal: Michal Knasiecki *
* *
*********************************************************************************/
/*Uwaga:
Graf znajduje sie w pliku graf.txt
W poniższej implementacji posłużono się biblioteką STL, która
zawiera szablon wektora oraz stosu.
Jeżeli twój kompilator nie posiada tej biblioteki możesz zastąpić
wektor tablicą i skorzystac z innej implementacji stosu.
*/
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#include <stack>
#include <vector>
//!Wartość, od której przyjmujemy nieskończoność
#define nieskonczonosc 1000
using namespace std;
class cGraf{
public:
/*!Macierz przyległości, w indeksie (i,j) zawiera wartości:
0 dla i=j
nieskonczonosc jeśli nie istnieje krawędź (i,j)
K>0 waga krawędzi (i,j)
*/
int A[100][100];
/*!Wektor odległości od pierwszego wierzchołka do pozostałych,
Zostal wyliczony przez algorytm Forda-Bellmana
*/
int D[100];
//!Liczba wierzchołków grafu
int n;
//!Stos, na którym odkładane będą wierzchołki tworzące drogę
stack <int, vector<int> > Stos;
//!Metoda wyznacza listę poprzednikow wierzchołka x
vector<int> Poprzedniki(int x){
vector<int> wynik;
for (int i=0;i<n;i++)
if ((A[i][x]!=nieskonczonosc)&&(A[i][x]!=0))
wynik.push_back(i);
return(wynik);
}
//Metoda konstruuje droge miedzy wierzcholkiem 1 i x o dlugosci D[x]
void KonstruujDroge(int x){
int u,v,i;
//!Lista poprzedników
vector<int> poprzedniki;
//Dodaj wierzchołek końcowy na stos
Stos.push(x);
v=x;
//Konstruuj drogę aż dojdziesz do wierzchołka startowego
while (v!=0){
poprzedniki=Poprzedniki(v);
for (i=0;i<poprzedniki.size();i++)
if (D[v]==D[poprzedniki[i]]+A[poprzedniki[i]][v])
u=poprzedniki[i];
Stos.push(u);
v=u;
}
/*Wypisujac wierzcholki dodaj 1, bo numerujemy je od jeden
a w macierzy od 0 */
printf("Droga od wierzcholka 1 do %d: ",x+1);
while (Stos.empty()!=true){
printf("%d ",Stos.top()+1);
Stos.pop();
}
printf("\n");
return;
}
};
void main(void)
{
FILE *plik;
char s[5];
int i,j;
cGraf Graf;
//--------------------------------------------
if ((plik=fopen("graf.txt","r"))==NULL)
printf("Brak pliku graf.txt!\n"); else
{
//!Wczytujemy liczbę wierzchołków grafu
fscanf(plik,"%d",&Graf.n);
//!Wczytujemy dane do macierzy przyległości
for (j=0;j<Graf.n;j++)
for (i=0;i<Graf.n;i++)
{
fscanf(plik,"%s",s);
if (strcmp(s,"*")!=0)
Graf.A[j][i]=atoi(s); else Graf.A[j][i]=nieskonczonosc;
}
//Wczytaj wektor odległosci, został on obliczony algorytmem Forda-Bellmana
for (i=0;i<Graf.n;i++){
fscanf(plik,"%s",s);
Graf.D[i]=atoi(s);
}
fclose(plik);
//Wyznacz drogi od wierzcholka 1 do pozostalych (w macierzy numerujemy je od 0)
for (i=1;i<Graf.n;i++)
Graf.KonstruujDroge(i);
}
printf("\nDowolny klawisz...\n");
getch();
return;
}

