Wyjaśnienie działania kodu dotyczącego przeszukiwania grafu

0

Witam mam przeanalizować kod. Wiedziec co i jak sie gdzie dzieje. Chciałbym aby ktoś powiedział co robią pętle. Jest to przeszukiwanie grafu w głąb i wypisanie czy istnieje droga miedzy wierzchołkami podanymi z pliku. Chciałbym wiedzieć po co i dlaczego są tam te 4x pętle while

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

struct wierzcholek {
    int *w;
    bool odw;
    int n;
    int zeg;
    int numer;
};

void szukaj_wglab (struct wierzcholek *G, struct wierzcholek v, int *clock, int T[]){
    *clock++;
    while ((T[v.numer-1])<v.n){
        if (G[v.w[T[v.numer-1]]-1].odw==false){
            G[v.w[T[v.numer-1]]-1].odw=true;
            G[v.w[T[v.numer-1]]-1].zeg=*clock;
            szukaj_wglab(G,G[v.w[T[v.numer-1]]-1],clock, T);
        }
        T[v.numer-1]++;
    }
}

int main()
{
    FILE *f=fopen("plik.txt","r");
    int N, i=0, vp1, vp2, vk1, vk2, clock=0;
    fscanf(f,"%d", &N);
    struct wierzcholek G[N];
    int T[N];
    while (i<N){
        G[i].odw=false;
        G[i].zeg=0;
        T[i]=0;
        fscanf(f,"%d",&(G[i].numer));
        fscanf(f,"%d",&(G[i].n));
        if (G[i].n!=0) G[i].w=malloc(G[i].n*sizeof(int));
        int j=0;
        while (j<G[i].n){
            fscanf(f,"%d",&(G[i].w[j]));
            j++;
        }
        i++;
    }
    fscanf(f,"%d", &vp1);
    fscanf(f,"%d", &vp2);
    fscanf(f,"%d", &vk1);
    fscanf(f,"%d", &vk2);
    G[vp1-1].odw=true;
    szukaj_wglab(G, G[vp1-1], &clock, T);
    int log=0;
    if (G[vp2-1].odw==true && G[vk1-1].odw==true && G[vk2-1].odw==true){
        int k=0;
        while (k<G[vk1-1].n && log==0){
            if (G[vk1-1].w[k]==vk2) {
                log=1;}
                else k++;
            }
            k=0;
            while (k<G[vk2-1].n && log==0){
            if (G[vk2-1].w[k]==vk1) {
                log=1;}
                else k++;
            }
        if (log==0) printf("nie ma drogi");
        while (k<G[vp1-1].n && log==1){
            if (G[vp1-1].w[k]==vp2) {
                log=2;}
                else k++;
            }
            k=0;
            while (k<G[vp2-1].n && log==1){
            if (G[vp2-1].w[k]==vp1) {
                log=2;}
                else k++;
            }
            if (log==2) printf("jest droga");
            else printf ("nie ma drogi");}
    else printf("nie ma drogi");
    return 0;
}
 
0

No więc przeczytaj jakiś kurs, przeczytaj na wikipedii jak działa ten algorytm BFS i przeanalizuj kod.
Alternatywa - poproś moderatora o przeniesienie wątku do odpowiedniego działu.
Chodzi o to że w tym dziale pomagamy (nie odwalamy pracy za ...) zrozumieć zagadnienia programistyczne dla tych kto chce to zrozumieć (nie wyłącznie zaliczyć).

1 użytkowników online, w tym zalogowanych: 0, gości: 1