/* * Na ulazu se daje broj Web strana (n) i broj * njihovih povezanosti linkovima (l, orijentisano). * Zatim se daju povezanosti, pocetna strana i * maksimalna dozvoljena dubina. * Odrediti strane cija je dubina veca od dozvoljene. */ #include #include #define POVEZANO 1 #define NEPOVEZANO 0 #define NEDEFINISANO -1 typedef struct element { int cvor; struct element *sledeci; } Element; //dodavanje na kraj reda ( zbog toga je potrebna i promenljiva kraj ) void dodaj( Element **pocetak, Element **kraj, int u ) { Element *novi; novi = ( Element * ) malloc( sizeof( Element ) ); novi -> cvor = u; novi -> sledeci = NULL; if ( *pocetak == NULL) *pocetak = *kraj = novi; else { ( *kraj ) -> sledeci = novi; *kraj = novi; } } //skidanje sa reda int skini( Element **pocetak, Element **kraj ) { Element *temp; int u; if ( *pocetak == NULL ) return NEDEFINISANO; else { temp = *pocetak; *pocetak = temp -> sledeci; if ( *kraj == temp ) *kraj = NULL; u = temp -> cvor; free( temp ); return u; } } void stampajPut( int *pret, int s, int v ) { if ( v == s ) printf("%d ", s ); else if ( pret[ v ] == NEDEFINISANO ) printf("Nema puta od %d do %d.", v, s ); else { stampajPut( pret, s, pret[ v ] ); printf("%d ", v ); } } int main() { //Uneti broj cvorova i veza int n, l; scanf("%d%d", &n, &l ); //Alocirati matricu povezanosti int **graf = ( int ** ) malloc( n * sizeof( int * ) ); for ( int i = 0; i < n; i++ ) graf[ i ] = ( int * ) malloc( n * sizeof( int ) ); //Alocirati niz rastojanja i niz prethodnika int *d = ( int * ) malloc( n * sizeof( int ) ); int *pret = ( int * ) malloc( n * sizeof( int ) ); //Inicijalizovati matricu povezanosti for ( int i = 0; i < n; i++ ) for ( int j = 0; j < n; j ++ ) graf[ i ][ j ] = NEPOVEZANO; //Uneti veze for ( int i = 0; i < l; i ++ ) { int u, v; scanf("%d%d", &u, &v ); graf[ u ][ v ] = POVEZANO; // Za neorijentisan graf dodati i graf[v][u] = POVEZANO; } //Uneti pocetni cvor i maksimalnu dubinu int s, maxDubina; scanf("%d%d", &s, &maxDubina ); //Inicijalizacija for ( int i = 0; i < n; i ++ ) { d[i] = NEDEFINISANO; pret[i] = NEDEFINISANO; } d[ s ] = 0; Element *pocetak = NULL, *kraj = NULL; dodaj( &pocetak, &kraj, s ); //Pretraga tj. BFS obilazak int u; while ( ( u = skini( &pocetak, &kraj ) ) != NEDEFINISANO ) for ( int v = 0; v < n; v ++ ) if ( graf[ u ][ v ] == POVEZANO && d[ v ] == NEDEFINISANO ) { d[ v ] = d[ u ] + 1; pret[ v ] = u; dodaj( &pocetak, &kraj, v ); } printf("Stranice koje ne ispunjavaju uslov:\n"); for ( int u = 0; u < n; u ++ ) if ( d[ u ] > maxDubina || d[ u ] == NEDEFINISANO ) { printf("%d: ", u ); stampajPut( pret, s, u ); putchar('\n'); } return 0; }