algoritmi za prebaruvanje grafovi

3
Алгоритам за пребарување на графови прво по широчина BFS #include <iostream> using namespace std; const int max_n = 10000; int lista_sosedstvo[max_n][max_n]; int lista_sosedstvo_dolzina[max_n] = {0}; int n; void dodaj_granka(int a, int b) { lista_sosedstvo[a][lista_sosedstvo_dolzina[a]] = b; ++lista_sosedstvo_dolzina[a]; lista_sosedstvo[b][lista_sosedstvo_dolzina[b]] = a; ++lista_sosedstvo_dolzina[b]; } int najkratka_ruta(int pocetok, int kraj) { //Niz u kojem su upisane oznake čvorova za BFS pretragu int int oznaka[max_n]; //Inicijalno svi čvorovi imaju oznaku -1, tj. nisu označeni for (int i =0; i < n; ++i) oznaka[i] = -1; //Čvor od kojeg se počinje BFS pretraga ima oznaku 0 oznaka[pocetok] = 0; //Varijabla za oznaku koja se trenutno obrađuje int momentalna_oznaka =0; /*Varijabla koja signalizira da li je posjećen barem jedan novi čvor u *prethodnoj iteraciji. Inicijalno je postavljena na true da bi se osigurao *prvi ulazak u while petlju*/ bool poseteno_barem_edano_teme = true; while (poseteno_barem_edano_teme) { poseteno_barem_edano_teme = false; /*Nalazimo čvorove čija je trenutna oznaka ona koja se obrađuje u *ovoj iteraciji*/ for(int momentalno_teme = 0; momentalno_teme < n; ++momentalno_teme) if (oznaka[momentalno_teme] == momentalna_oznaka) /*Sve prethodno neposjećene čvorove iz liste susjedstva ovog *čvora označavamo sa sljedećom oznakom*/ for(int j = 0; j < lista_sosedstvo_dolzina[momentalno_teme]; ++j) { int soseden_cvor = lista_sosedstvo[momentalno_teme][j]; if(oznaka[soseden_cvor] == -1) { oznaka[soseden_cvor] = momentalna_oznaka + 1; poseteno_barem_edano_teme = true; } }

Upload: milena-kraleva

Post on 11-Apr-2016

37 views

Category:

Documents


10 download

DESCRIPTION

algoritmi

TRANSCRIPT

Page 1: Algoritmi Za Prebaruvanje Grafovi

Алгоритам за пребарување на графови прво по широчина BFS#include <iostream>using namespace std;const int max_n = 10000;int lista_sosedstvo[max_n][max_n];int lista_sosedstvo_dolzina[max_n] = {0};int n;void dodaj_granka(int a, int b){ lista_sosedstvo[a][lista_sosedstvo_dolzina[a]] = b; ++lista_sosedstvo_dolzina[a]; lista_sosedstvo[b][lista_sosedstvo_dolzina[b]] = a; ++lista_sosedstvo_dolzina[b];}int najkratka_ruta(int pocetok, int kraj){//Niz u kojem su upisane oznake čvorova za BFS pretragu intint oznaka[max_n];//Inicijalno svi čvorovi imaju oznaku -1, tj. nisu označenifor (int i =0; i < n; ++i) oznaka[i] = -1;//Čvor od kojeg se počinje BFS pretraga ima oznaku 0 oznaka[pocetok] = 0;//Varijabla za oznaku koja se trenutno obrađujeint momentalna_oznaka =0;/*Varijabla koja signalizira da li je posjećen barem jedan novi čvor u*prethodnoj iteraciji. Inicijalno je postavljena na true da bi se osigurao*prvi ulazak u while petlju*/ bool poseteno_barem_edano_teme = true;while (poseteno_barem_edano_teme) { poseteno_barem_edano_teme = false;/*Nalazimo čvorove čija je trenutna oznaka ona koja se obrađuje u*ovoj iteraciji*/for(int momentalno_teme = 0; momentalno_teme < n; ++momentalno_teme)if (oznaka[momentalno_teme] == momentalna_oznaka)/*Sve prethodno neposjećene čvorove iz liste susjedstva ovog*čvora označavamo sa sljedećom oznakom*/for(int j = 0; j < lista_sosedstvo_dolzina[momentalno_teme]; ++j) { int soseden_cvor = lista_sosedstvo[momentalno_teme][j]; if(oznaka[soseden_cvor] == -1) { oznaka[soseden_cvor] = momentalna_oznaka + 1; poseteno_barem_edano_teme = true; } }//U narednoj iteraciji treba obraditi sljedeću oznaku ++momentalna_oznaka; }/*Kako je kod netežinskih grafova oznaka u BFS pretrazi ustvari najkrača*udaljenost od početnog čvora vračamo oznaku čvora kraj. Ako je njegova*oznaka -1, onda čvor nije bio nikako posjećen, pa ne postoji ruta od*čvora pocetak do čvora kraj*/return oznaka[kraj];}

Page 2: Algoritmi Za Prebaruvanje Grafovi

int main(){ //Učitavanje podataka iz ulazne datotekeint m; cin>>n>>m;for(int i = 0; i < m; ++i) {int a, b; cin>>a>>b; dodaj_granka(a, b); }int x, y; cin>>x>>y;//Najkrača ruta se određuje primjenom BFS pretrageint rastojanie = najkratka_ruta(x, y);//Ispis rezultata u izlaznu datotekuif (rastojanie == -1) cout<<"Patot ne postoi.\n";else cout<<rastojanie;return 0;}

Алгоритам за пребарување на графови прво по длабочина DFS#include <iostream>using namespace std;const int max_n = 1000;int n;bool matrica_susjedstva[max_n][max_n];void dodaj_granu(int a, int b){ matrica_susjedstva[a][b] = true; matrica_susjedstva[b][a] = true;}bool dfs_posjecen_cvor[max_n];void dfs(int cvor){ dfs_posjecen_cvor[cvor] = true; for(int i = 0; i < n; ++i) if(matrica_susjedstva[cvor][i] && !dfs_posjecen_cvor[i]) dfs(i);}bool povezani_cvorovi(int prvi_cvor, int drugi_cvor){ for (int i = 0; i < n; ++i) dfs_posjecen_cvor[i] = false; dfs(prvi_cvor); return dfs_posjecen_cvor[drugi_cvor];}

int main(){ int m; cin>>n>>m; int a,b;for(int i = 0; i < m; ++i) { cin>>a>>b; dodaj_granu(a,b); } int x,y; cin>>x>>y; if(povezani_cvorovi(x, y)) cout<<"postoi"; else cout<<"Ne postoi";return 0;}