1. Cel projektu. 2. Metoda podziału i ograniczeń dla problemu komiwojaŝera - algorytm Little`a (1962r.). ZAŁOśENIE III

Podobne dokumenty
Instrukcja wyboru, pętle. 2 wykład. Podstawy programowania - Paskal

PODSTAWY INFORMATYKI 1 PRACOWNIA NR 6

dr inż. Jarosław Forenc

TABLICE W JĘZYKU C/C++ typ_elementu nazwa_tablicy [wymiar_1][wymiar_2]... [wymiar_n] ;

Wykład 3. Instrukcje powtarzające

tablica: dane_liczbowe

[1] E. M. Reingold, J. Nievergelt, N. Deo Algorytmy kombinatoryczne PWN, 1985.

np. dla p=1 mamy T1(N) N/2 średni czas chybionego wyszukiwania z prawdopodobieństwem q:

W języku C dostępne są trzy instrukcje, umożliwiające tworzenie pętli: for, while oraz do. for (w1;w2;w3) instrukcja

Algorytm selekcji Hoare a. Łukasz Miemus

WYKŁAD 8. Funkcje i algorytmy rekurencyjne Proste przykłady. Programy: c3_1.c..., c3_6.c. Tomasz Zieliński

Język C zajęcia nr 5

Proste typy zmiennych języka C++ *) Zapis 3.4 e-38 jest równoważny zapisowi 3,

Informacje wstępne #include <nazwa> - derektywa procesora umożliwiająca włączenie do programu pliku o podanej nazwie. Typy danych: char, signed char

Wstęp do Programowania, laboratorium 02

Rozdział 3 ZADANIE TRANSPORTOWE I PROBLEM KOMIWOJAŻERA

WYKŁAD 9. Algorytmy sortowania elementów zbioru (tablic) Programy: c4_1.c... c4_3.c. Tomasz Zieliński

Programowanie w języku C++ Agnieszka Nowak Brzezińska Laboratorium nr 2

Wybrane podstawowe rodzaje algorytmów

Rozwiązanie. #include <cstdlib> #include <iostream> using namespace std;

Wstęp do Informatyki zadania ze złożoności obliczeniowej z rozwiązaniami

MACIERZE. Sobiesiak Łukasz Wilczyńska Małgorzata

Wykład 7 Abstrakcyjne typy danych słownik (lista symboli)

Język C zajęcia nr 7. Uwagi dotyczące stylu programowania

Funkcje i tablice. Elwira Wachowicz. 23 maja 2013

Warto też w tym miejscu powiedzieć, że w C zero jest rozpoznawane jako fałsz, a wszystkie pozostałe wartości jako prawda.

KURS C/C++ WYKŁAD 2. char znak; znak = a ; Program 2 #include<stdio.h> void main() { char znak; while( (znak = getchar() )!= t ) putchar(znak); }

Wstęp do informatyki- wykład 6

Algorytmy i struktury danych. Co dziś? Tytułem przypomnienia metoda dziel i zwyciężaj. Wykład VIII Elementarne techniki algorytmiczne

Podstawy Programowania C 02

for (i=0; i<10; i=i+1) instrukcja; instrukcja zostanie wykonana 10 razy for (inicjalizacja; test; aktualizacja) instrukcja;

Wskaźniki. Programowanie Proceduralne 1

PRZYKŁADY OPERACJI PLIKOWYCH z wykorzystaniem biblioteki <stdio.h>

Liczby całkowite i rzeczywiste

// Liczy srednie w wierszach i kolumnach tablicy "dwuwymiarowej" // Elementy tablicy są generowane losowo #include <stdio.h> #include <stdlib.

Jerzy Nawrocki, Wprowadzenie do informatyki

wykład II uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - funkcje, tablice i wskaźniki wykład II dr Jarosław Mederski Spis

Zagadnienie transportowe (badania operacyjne) Mgr inż. Aleksandra Radziejowska AGH Akademia Górniczo-Hutnicza w Krakowie

Klasyczne zagadnienie przydziału

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 9. Karol Tarnowski A-1 p.

Definicja pochodnej cząstkowej

Matematyka stosowana i metody numeryczne

Program na zaliczenie: Odejmowanie widm

Programowanie proceduralne INP001210WL rok akademicki 2017/18 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

1 Problem transportowy Wstęp Metoda górnego-lewego rogu Metoda najmniejszego elementu... 11

Proste algorytmy w języku C

Proste algorytmy w języku C

Wstęp do wskaźników w języku ANSI C

Ćwiczenie 4 z Podstaw programowania. Język C++, programy pisane w nieobiektowym stylu programowania. Zofia Kruczkiewicz

Podstawy Kompilatorów

Algorytm. a programowanie -

Struktura programu. Projekty złożone składają się zwykłe z różnych plików. Zawartość każdego pliku programista wyznacza zgodnie z jego przeznaczeniem.

Metody Metody, parametry, zwracanie wartości

Rozdział 6 PROGRAMOWANIE WYPUKŁE I KWADRATOWE

Deklaracje. W większości języków programowania(nie we wszystkich) wymaga się, żeby użyte w programie zmienne były wcześniej zadeklarowane:

Rozdział 1 PROGRAMOWANIE LINIOWE

INFORMATYKA Z MERMIDONEM. Programowanie. Moduł 5 / Notatki

// Funkcja glowna int main() { // zmienne int kont='t'; double x1, y1, x2, y2, x3, y3, a, b, c, p1, p2, p3, pole, ha, hb, hc;

W większości języków programowania(nie we wszystkich) wymaga się, żeby użyte w programie zmienne były wcześniej zadeklarowane:

Rozwiązywanie problemów z użyciem Solvera programu Excel

Informatyka I. Wykład 3. Sterowanie wykonaniem programu. Instrukcje warunkowe Instrukcje pętli. Dr inż. Andrzej Czerepicki

Część 4 pętla FOR. Instrukcja pętli iteracyjnej FOR. Postać pętli for jest następująca: a)dla jednej instrukcji wykonywanej przez pętlę.

ZAGADNIENIE TRANSPORTOWE

2.8. Algorytmy, schematy, programy

Funkcje. Piotr Zierhoffer. 7 października Institute of Computer Science Poznań University of Technology

15. Macierze. Definicja Macierzy. Definicja Delty Kroneckera. Definicja Macierzy Kwadratowej. Definicja Macierzy Jednostkowej

do instrukcja while (wyrażenie);

Rozdział 2 PROGRAMOWANIE LINIOWE CAŁKOWITOLICZBOWE

Co to jest algorytm? przepis prowadzący do rozwiązania zadania, problemu,

Wymiar musi być wyrażeniem stałym typu całkowitego, tzn. takim, które może obliczyć kompilator. Przykłady:

Język C część 2. Podejmowanie decyzji w programie. if else. switch

Pliki w C/C++ Przykłady na podstawie materiałów dr T. Jeleniewskiego

Ćwiczenie 3 z Podstaw programowania. Język C++, programy pisane w nieobiektowym stylu programowania. Zofia Kruczkiewicz

Tablice mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2011

Podstawy programowania. Wykład Pętle. Tablice. Krzysztof Banaś Podstawy programowania 1

Program znajduje największa lub najmniejsza z podanych liczb. Liczby podajemy dopóki nam sie nie znudzi.

- - Ocena wykonaniu zad3. Brak zad3

Algorytmy równoległe. Rafał Walkowiak Politechnika Poznańska Studia inżynierskie Informatyka 2010

Podstawy algorytmiki i programowania - wykład 2 Tablice dwuwymiarowe cd Funkcje rekurencyjne

Funkcja (podprogram) void

Argumenty wywołania programu, operacje na plikach

Temat 1: Podstawowe pojęcia: program, kompilacja, kod

Obliczenie pola wieloboku na podstawie współrzędnych wierzchołków

Proste programy w C++ zadania

WYKŁAD 10. Zmienne o złożonej budowie Statyczne i dynamiczne struktury danych: lista, kolejka, stos, drzewo. Programy: c5_1.c, c5_2, c5_3, c5_4, c5_5

Podstawy programowania C. dr. Krystyna Łapin

Podstawy programowania. Wykład: 4. Instrukcje sterujące, operatory. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Wstęp do programowania

Wykład 1_2 Algorytmy sortowania tablic Sortowanie bąbelkowe

dr inż. Jarosław Forenc

EGZAMIN MATURALNY 2011 INFORMATYKA

1,3,4,2,3,4,0,1,4,5,0. Wówczas największa suma trzech kolejnych liczb (zaznaczone na czerwono) wynosi:

while (test) instrukcja; int i=0; while (i<10) i++; dopóki test prawdziwy wykonuj instrukcję Wykonano: 35% / \ fałsz test prawda instrukcja

operacje porównania, a jeśli jest to konieczne ze względu na złe uporządkowanie porównywanych liczb zmieniamy ich kolejność, czyli przestawiamy je.

PROGRAMOWANIE IMPERATYWNE JĘZYK C

Programowanie dynamiczne cz. 2

Zagadnienie transportowe

mgr Anna Bernaciak Wyższa Szkoła Logistyki Badania operacyjne II Zagadnienie komiwojażera Zadanie 1 Rozwiązanie zadania 1. Krok i to minimalny

1 Podstawy c++ w pigułce.

int tab[5]; tab[1]; ciągły obszar pamięci, w którym umieszczone są elementy tego samego typu macierz [ ] - dwuargumentowy operator indeksowania

Transkrypt:

1. Cel projektu. Celem projektu jest rozwiązanie problemu komiwojaŝera metodą podziału i ograniczeń. Sporządzenie odpowiedniego algorytmu działania i napisanie programu w języku C, który będzie realizował powyŝszy algorytm, rozwiązując dane zagadnienie. 2. Metoda podziału i ograniczeń dla problemu komiwojaŝera - algorytm Little`a (1962r.). ZAŁOśENIE I Cykl Hamiltona zawiera dokładnie jeden element z kaŝdego wiersza i dokładnie jeden element z kaŝdej kolumny, który zawiera się w macierzy kosztów. ZAŁOśENIE II JeŜeli od wszystkich elementów jakiegoś wiersza i jakieś kolumny macierzy kosztów, odejmiemy stałą, to waga kaŝdego cyklu Hamiltona zmniejszy się dokładnie o tę stałą. ZAŁOśENIE III JeŜeli wielokrotnie zastosujemy ZAŁOśENIE II, do momentu aŝ otrzymamy w kaŝdym wierszu i kaŝdej kolumnie co najmniej jedno zero, a pozostałe elementy macierzy kosztów są nieujemne, to całkowita suma odjętych stałych jest dolnym ograniczeniem długości jakiegokolwiek cyklu Hamiltona. Rozwiązanie moŝna podzielić na dwa podzbiory: złoŝony z rozwiązań zawierających wyróŝniony łuk, złoŝony z rozwiązań nie zawierających wyróŝnionego łuku.

3. Algorytm rozwiązania problemu komiwojaŝera.

4. Przykład rozwiązania problemu komiwojaŝera metodą podziału i ograniczeń, wykorzystując algorytm Little`a. Macierz kosztów: 1 12 3 45 6 2 78 90 21 3 3 5 56 23 98 4 12 6 8 34 5 3 98 3 2 a) Szukamy najmniejszych elementów w wierszach i odejmujemy je od reszty elementów zawartych w nich: min 1 12 3 45 6 3 2 78 90 21 3 3 3 5 56 23 98 5 4 12 6 8 34 6 5 3 98 3 2 2 2 75 87 18 0 3 0 51 18 93 4 6 0 2 28 b) Szukamy najmniejszych elementów w kolumnach i odejmujemy je od reszty elementów zawartych w nich: 2 75 87 18 0 3 0 51 18 93 4 6 0 2 28 min 0 0 0 0 0 2 75 87 18 0 3 0 51 18 93 4 6 0 2 28

Nowa macierz kosztów: 2 75 87 18 0 3 0 51 18 93 4 6 0 2 28 c) Liczymy dolne ograniczenie, które jest sumą wszystkich elementów skróconych w wierszach i kolumnach: LB = 3 + 3 + 5 + 6 + 2 + 0 + 0 + 0 + 0 + 0 = 19 d) Przeszukujemy kaŝdy wiersz i kolumnę w poszukiwaniu najmniejszego elementu (Wartość zero jest pomijane w poszukiwaniach, uwzględnia się je dopiero jak wystąpi co najmniej dwa razy): 3 2 75 87 18 0 18 3 0 51 18 93 18 4 6 0 2 28 2 1 1 9 1 18 3 e) Z odnalezionych elementów wybieramy wartość posiadającą największy koszt: 3 2 75 87 18 0 18 3 0 51 18 93 18 4 6 0 2 28 2 1 1 9 1 18 3 f) Skracamy w zaleŝności wystąpienia największego z minimów kolumnę (wiersz) oraz wiersz (kolumnę), w którym w skracanej kolumnie (wierszu) wystąpiło zero: 3 2 75 87 18 0 18 3 0 51 18 93 18 4 6 0 2 28 2 1 1 9 1 18 3 Dla danego przykładu usunięta zostanie kolumna 4 i wiersz 5.

g) Blokujemy przejście powrotne, poprzez wstawienie w kolumnie 5 i wierszu 4 nieskończonego kosztu przebycia drogi: 2 75 87 18 0 3 0 51 18 93 4 6 0 2 h) Powstaje nowa skrócona macierz kosztów, oraz macierz, w której zostało zablokowane przejście dla skróconego przejścia. Wartość dolnego ograniczenia powiększona zostaje o koszt usuniętego elementu: Macierz skrócona LB=19 1 2 3 5 1 9 0 3 2 75 87 0 3 0 51 93 4 6 0 2 Macierz nie skrócona LB = 19 + 18 = 37 2 75 87 18 0 3 0 51 93 4 6 0 2 Czynności te są powtarzane do uzyskania macierzy kosztów o wymiarze 2x2.

Ponownie zostają wykonane podpunkty a, b: Ponownie zostaje wykonany podpunkt e, f, g: 1 2 3 5 1 9 0 3 2 75 87 0 3 0 51 93 4 6 0 2 1 2 3 5 min 1 9 0 3 0 2 75 87 0 0 3 0 51 93 0 4 6 0 2 0 1 2 3 5 1 9 0 3 2 75 87 0 3 0 51 93 4 6 0 2 min 0 0 0 0 Wartość dolnego ograniczenia pozostaje bez zmian. 1 2 3 5 1 9 0 3 3 2 75 87 0 75 3 0 51 93 51 4 6 0 2 2 6 9 2 3 1 2 3 5 1 9 0 3 3 2 75 87 0 75 3 0 51 93 51 4 6 0 2 2 6 9 2 3 Skracamy kolumnę 5 i wiersz 2, zaś blokujemy przejście miedzy kolumną 2 i wierszem 5.

Tworzymy nową macierz kosztów, a w drugiej blokujemy kolejne przejście i obliczamy wartość dolnego ograniczenia tak samo jak w podpunkcie h: Ponownie zostają wykonane podpunkty a, b: Macierz skrócona LB = 19 1 2 3 1 9 0 3 0 51 4 6 0 2 Macierz nie skrócona LB = 37 + 75 = 112 2 87 18 0 3 0 51 93 4 6 0 2 Ponownie powtarzamy czynności. 1 2 3 1 9 0 3 0 51 4 6 0 2 1 2 3 min 1 9 0 0 3 0 51 0 4 6 0 2 0 1 2 3 1 9 0 3 0 51 4 6 0 2 min 0 0 0 Wartość dolnego ograniczenia pozostaje bez zmian.

Ponownie zostaje wykonany podpunkt e, f, g: 1 2 3 1 9 0 9 3 0 51 51 4 6 0 2 2 6 9 2 1 2 3 1 9 9 3 0 51 51 4 6 0 2 2 6 9 2 Skracamy kolumnę 1 i wiersz 3, zaś blokujemy przejście miedzy kolumną 3 i wierszem 1. Tworzymy nową macierz kosztów, a w drugiej blokujemy kolejne przejście i obliczamy wartość dolnego ograniczenia tak samo, jak w podpunkcie h: Macierz skrócona LB = 19 2 3 1 9 4 0 2 Macierz nie skrócona LB = 112 + 51 = 163 2 87 18 0 3 0 93 4 6 0 2

Uzyskaną macierz kosztów o wymiarze 2x2 przeszukujemy w poszukiwaniu najmniejszych wartości w kolumnach i wierszach, następnie redukujemy macierz tak, aby w kaŝdym wierszu i kolumnie występowało zero, a w kolejnym kroku dodajemy odjęte wartości do dolnego ograniczenia. 2 3 1 9 9 4 0 2 0 2 3 1 0 4 0 2 0 2 2 3 1 0 4 0 0 LB = 19 + 9 + 2 = 30 Ustalamy drogę po jakiej powinniśmy się poruszać na podstawie kolejno skracanych wierszy i kolumn: (5 4) (2 5) (3 1) oraz wykorzystując zawartość macierzy końcowej: (1 2) (4 3) Daje to nam następującą drogę: (3 1) (1 2) (2 5) (5 4) (4 3) (3 1)

5. Listing programu. #include <stdio.h> #include <conio.h> main() //Deklaracje zmiennych int miasta[10][10], i, j, n, m, min, pomoc[10], pomoc2[10], k=0, suma=0; int zera=0, h=0, pp; int max, szuki, szukj, ciag[200], szukane[20], dobry[10], dobry2[10]; int indi, indj, ii, jj, x, y, indii, indjj; int maxmin1, maxmin2, pomocnik, petla, f, b=0, kolejny=0; //Wprowadzenie danych wejsciowych clrscr(); puts("\t\t*** Problem komiwojazera dla n miast ***\n"); puts("\t\t***metoda podzialu i ograniczen***\n"); puts("\t\t***wg algorytmu Little'a (1962r.)***"); printf("\npodaj ilosc miast: "); scanf("%d", &m); puts("\n"); puts("\t *** Przy braku drogi z miasta do miasta, nalezy wpisac: 999 ***\n"); n=m+1; petla=m-1; //Wprowadzenie indeksowania macierzy i wprowadzenie do niej danych j=0; miasta[i][0]=h; h++; i=0; h=0; miasta[0][j]=h; h++; /* for(i=1; i<=n; i++) for(j=1; j<=n; j++) if(i==j) miasta[i][j]=999; pp=1; */ for(i=1; i<=m; i++) for(j=1; j<=m; j++) if(i==j)miasta[i][j]=999; else printf("podaj odleglosc miedzy miastem %d a %d: ", i, j); scanf("%d", &miasta[i][j]); puts("\n"); //pomocnik=miasta[i][j]; //miasta[j][i]=pomocnik; //Wydruk macierzy wejsciowej clrscr(); printf("\n\nmacierz miast:"); puts("\n");

printf(" %d", miasta[i][j]); //Szukanie maksimum z minimum, jakie mozna odjac od wierszy i kolumn for(petla; petla>=2; petla--) for(k=0; k<10; k++) pomoc[k]=0; pomoc2[k]=0; k=1; for(i=1; i<=n; i++) min=miasta[i][1]; for(j=1; j<n; j++) if(miasta[i][j]<=min && miasta[i][j]>=0 && miasta[i][j]<900) min=miasta[i][j]; pomoc[k]=min; k++; k=1; for(i=1; i<n; i++) for(j=1; j<n; j++) if(miasta[i][j]<900) miasta[j][i]=miasta[i][j]-pomoc[k]; k++; h=1; for(j=1; j<n; j++) min=miasta[1][j]; for(i=1; i<n; i++) if(miasta[i][j]<min && miasta[i][j]>=0 && miasta[i][j]<900) min=miasta[i][j]; pomoc2[h]=min; h++; h=1; for(j=1; j<n; j++) for(i=1; i<=n; i++) if(miasta[i][j]<900) miasta[i][j]=miasta[i][j]-pomoc2[h]; h++; printf("\n\n"); printf("\n najmniejsze elementy z wierszy:"); for(h=1; h<n; h++) printf(" %d",pomoc[h]); printf("\n\n"); printf("\n najmniejsze elementy z kolumn:"); for(h=1; h<n; h++) printf(" %d",pomoc2[h]); //Wydruk macierzy po odjeciu printf("\n\nmacierz miast:"); puts("\n"); printf(" %f", miasta[i][j]); //obliczenie sumy Kosztow

for(h=0; h<n; h++) if(pomoc[h]==-1)pomoc[h]=0; if(pomoc2[h]==-1)pomoc2[h]=0; suma=suma+pomoc[h]+pomoc2[h]; printf("\n\nlow Bound= %d", suma); //Szukanie maksimum w minimach do skrocenia kolumny i wiersza if(n>3) //Przeszukanie wierszy w poszukiwaniu minimow k=1; zera=0; for(i=1; i<n; i++) min=999; for(j=1; j<n; j++) if(miasta[i][j]=0) zera++; if(zera>=2) min=0; else if(miasta[i][j]<900 && miasta[i][j]>0 && miasta[i][j]<=min) min=miasta[i][j]; pomoc[k]=min; k++; zera=0; //przeszukanie kolumn w poszukiwaniu minimow k=1; for(j=1; j<n; j++) min=999; for(i=1; i<n; i++) if(miasta[i][j]==0)zera++; if(zera>=2)min=0; else if(miasta[i][j]<900 && miasta[i][j]>0 && miasta[i][j]<=min) min=miasta[i][j]; pomoc2[k]=min; k++; zera=0; //wyswietlenie minimow z wierszy i kolumn printf("\n\n\n"); for(k=1; k<n;k++) printf(" %d,",pomoc[k]); printf("\n\n"); for(k=1; k<n;k++) printf(" %d,",pomoc2[k]); // znalezienie najwiekszego z minimow i wyswietlenie go maxmin1=pomoc[1]; for(k=1; k<n; k++) if(pomoc[k]>maxmin1) maxmin1=pomoc[k]; szuki=k;

maxmin2=pomoc2[1]; for(k=1; k<n; k++) if(pomoc2[k]>=maxmin2) maxmin2=pomoc2[k]; szukj=k; printf("\n\n najwieksze min z wierszy to %d",maxmin1); printf("\n\n najwieksze minimum z kolumn to %d",maxmin2); max=0; if(maxmin1<maxmin1) max=maxmin1; else max=maxmin1; if(max==maxmin1) for(j=1;j<n;j++) if(miasta[szuki][j]==max) indi=szuki; indj=j; else if(max==maxmin2) for(i=1;i<n;i++) if(miasta[i][szukj]==max) indi=i; indj=szukj; printf("\n\n maksymalna wartosc to %d",max); printf("\n\n dla indeksow: i=%d, j=%d",indi,indj); //poszukiwanie kolumny i wiersza, ktore zostana skrocone if(max==maxmin1) for(j=1;j<n;j++) if(miasta[indi][j]==0) jj==j; ii==indi; if(max==maxmin2) for(i=1;i<n;i++) if(miasta[i][indj]==0) ii==i; jj==indj; szukane[b]=miasta[ii][0]; indii=szukane[b]; szukane[b]=miasta[0][jj]; indjj=szukane[b]; printf("\n\n skracamy wiersz: %d i kolumne %d",indii,indjj); //Blokowanie przejscia z powrotem do miasta x

miasta[indjj][indii]=999; //Drukowanie macierzy po przeksztalceniach printf("\n\nmacierz miast:"); puts("\n"); printf(" %d", miasta[i][j]); //Zmniejszanie macierzy i wpisywanie do niej danych miasta[i][jj]=-1; miasta[ii][j]=-1; printf("\n\nmacierz miast:"); puts("\n"); printf(" %d", miasta[i][j]); h=0; if(miasta[i][j]>0) ciag[h]=miasta[i][j]; h++; //puts("\n"); for(h=0; h<n*n; h++) //printf("%d ", ciag[h]); n--; h=0; miasta[i][j]=ciag[h]; h++; //Drukowanie macierzy po przeksztalceniach printf("\n\nmacierz miast:"); puts("\n"); printf(" %d", miasta[i][j]); //Dopisywanie do kosztu i szukanej drogi, niezbednych danych for(i=1; i<n; i++)

for(j=1; j<n; j++) if(miasta[i][j]>0 && miasta[i][j]<900) suma=suma+miasta[i][j]; if(m>3) if((miasta[1][1]==999 && miasta[1][2]==999) (miasta[1][2]==999 && miasta[2][2]==999) (miasta[2][2]==999 && miasta[2][1]==999) (miasta[2][1]==999 && miasta[1][1]==999)) puts("\nodnies sie do macierzy poprzedniej, by odnalezc ostatnie elementy szukanej drogi\n"); else if(miasta[1][1]==999 miasta[2][2]==999) szukane[b]=miasta[2][0]; szukane[b]=miasta[0][1]; szukane[b]=miasta[1][0]; szukane[b]=miasta[0][2]; else szukane[b]=miasta[1][0]; szukane[b]=miasta[0][1]; szukane[b]=miasta[2][0]; szukane[b]=miasta[0][2]; //Wyswietlanie koncowej drogi i kosztu printf("\n\nkoncowy koszt podrozy wynosi: %d\n", suma); puts("\n\nszukane: "); for(f=0; f<2*m; f++) printf("%d ", szukane[f]); kolejny=szukane[0]; puts("\nszukana droga:\n"); for(i=0; i<m; i++) for(f=0; f<=2*m; f=f+2) if(szukane[f]==kolejny) dobry[b]=szukane[f]; f++; dobry2[b]=szukane[f]; kolejny=szukane[f]; f=0; for(b=0; b<=m-1; b++) printf("(%d %d) ",dobry[b], dobry2[b]); //Koniec programu clrscr(); puts("\t\t\t***program napisany na zajecia***\n"); puts("\t\t***ze Sterowania Procesami Dyskretnymi***\n"); puts("\t\t***prowadzacy: Dr inz. Janusz Paplinski***\n"); return 0;