Problem polega na tym, że jest to część mojego programu, który oddaje na zaliczenie, a prowadzący zwrócił mi go i powiedział, że brakuje jakiegoś warunku w miejscu gdzie zaznaczyłem strzałkami. <<<<<<---------TUTAJ !!!!!!!!!
Aby ułatwić dodam, że pierwsza część programu to alg. Dijkstry sprawdzający spójnosc grafu, a potem zaczyna sie alg. fleuryego. Nie wiem o co mu chodzi, a program muszę jak najszybciej mu oddać :/ Może ktoś wie?
Coś mówił, że może być sytuacja, że jak usunę parę krawędzi, to zostanie wierzchołek nie mający żadnej krawędzi przy sobie, a Dijkstra będzie wykazywała spojność. Więc chyba powinienem dać warunek usuwaniu wierzchołka, ale własne nie wiem ?
int MacierzGrafu::alg_Dijkstry(int Macierz[][Max], int pierwszy, bool odwiedzony[])
{
pom2=0;
int u;
for(i = 0; i<Max;i++)
{
usuniety[i] = false;
Waga[i] = 100000;
Sciezka[i] = 0;
}
Waga[pierwszy] = 0; //wybor pierwszego wierzcholka.
for(i=0; i<wierzcholek; i++)
{
u = -1;
for( j=0; j<wierzcholek; j++ )
if( !usuniety[j] && ( u == -1 || Waga[j]<Waga[u] )) //szukam wierzcholka o najmniejszej wadze
u = j;
usuniety[u] = true; //przenosze do zbioru wierzcholkow usunietych
for( k=0; k<wierzcholek; k++ )
if( Macierz[u][k] > 0 )
if( !usuniety[k] && ( Waga[k] > Waga[u] + Macierz[u][k] ))
{
Waga[k] = Waga[u] + Macierz[u][k];
Sciezka[k] = u;
}
}
for(i=0; i<wierzcholek; i++) <<<<<<---------TUTAJ !!!!!!!!!
if( Waga[i] >= 100000 && !odwiedzony[i] ) <<<<<<---------TUTAJ !!!!!!!!!!
return 0;
return 1;
}
////////////////////////////////////////////////////////////////////////////////
double MacierzGrafu::alg_Eulera()
{
int wyjscie;
int x;
kolejka.clear();
// tworzymy kopię grafu.
for(i=0; i<wierzcholek; i++)
for(j=0; j<wierzcholek; j++)
KopiaGrafu[i][j] = Graf[i][j];
x = 0; //gdy nie ma wierzcholka o nieparzystym stopniu to
// przyjmujemy wierzcholek startowy jako wierzcholek 0.
for(i=0; i<wierzcholek; i++)
{
licznik = 0;
usuniety[i] = false;
for( j=0; j<wierzcholek; j++ )
if( Graf[i][j] > 0)
licznik++;
if(licznik % 2) // jeżeli wierzcholek jest nieparzystego stopnia
{
x = i;
break;
}
}
kolejka.push_back(x); // wpisujemy do listy wierzcholek x
if(alg_Dijkstry(KopiaGrafu,x,usuniety)) // sprawdzamy czy graf poczatkowy jest spojny
{
while(true)
{
wyjscie = 0;
licznik = 0;
for(j=0; j<wierzcholek; j++)
if(KopiaGrafu[x][j] > 0)
licznik++;
if(licznik > 1) // jeżeli pozostała więcej niż jedna krawędz
{
for(m=1; m<wierzcholek; m++)
{
if(!wyjscie && KopiaGrafu[x][m] > 0)
{
pom1 = KopiaGrafu[x][m]; // kopiujemy wartość wagi
KopiaGrafu[x][m] = KopiaGrafu[m][x] = 0; // usuwamy krawedz
if(alg_Dijkstry(KopiaGrafu,x,usuniety)) // spr. czy po usunięciu krawędzi graf dalej jest spojny
{
usuniety[x] = true; // zapisujemy krawędź jako usunieta
kolejka.push_back(m); // wpisujemy na koniec listy wierzcholek m
x = m;
wyjscie = 1;
}
else // jeżeli graf nie jest spójny to:
KopiaGrafu[x][m] = KopiaGrafu[m][x] = pom1; // nie usuwa krawedzi
}
}
}
else if(licznik == 1)// jeżeli pozostała jedna krawędz
{
for(m=0; m<wierzcholek; m++)
if(KopiaGrafu[x][m] > 0)
{
KopiaGrafu[x][m] = 0;
KopiaGrafu[m][x] = 0;
usuniety[x] = true; // zapisujemy krawędź jako usnieta
kolejka.push_back(m); // wpisujemy na koniec listy wierzcholek m.
x = m;
}
}
// konczymy przeszukiwanie.
else if(licznik == 0) break;
}
}
else
cout << "Wygenerowany graf nie jest spójny!" << endl;
}
// popraw temat [mf]