Cod sursa(job #2533037)

Utilizator Tudor06MusatTudor Tudor06 Data 28 ianuarie 2020 18:28:38
Problema BFS - Parcurgere in latime Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.67 kb
#include <iostream>
#include <bitset>
#include <stdio.h>
#include <vector>
#include <deque>
#include <ctype.h>

using namespace std;

const int NMAX = 1e5 + 1;
bitset<NMAX> vizitat;
vector<int> v[NMAX];
deque<int> dq;
int dist[NMAX];
FILE *fin, *fout;

int numar() {
    char ch;
    int nr = 0;
    while ( isspace( ch = fgetc( fin ) ) );
    do {
        nr = nr * 10 + ch - '0';
    } while ( isdigit( ch = fgetc( fin ) ) );
    return nr;
}

int main() {
    fin = fopen( "bfs.in", "r" );
    fout = fopen( "bfs.out", "w" );
    int n, m, i, k, nod, nod2;
    vector<int>::iterator it;
    n = numar();
    m = numar();
    k = numar();
    for ( i = 0; i < m; i ++ ) {
        nod = numar();
        nod2 = numar();
        if ( nod != nod2 )
            v[nod].push_back( nod2 );
    }
    for ( i = 0; i <= n; i ++ )
        dist[i] = 1000000;

    vizitat[k] = 1;
    for ( it = v[k].begin(); it != v[k].end(); it ++ ) {
        dq.push_back( *it );
        dist[*it] = 1;
    }
    while ( !dq.empty() ) {
        nod = dq.front();
        if ( !vizitat[nod] ) {
            vizitat[nod] = 1;
            for ( it = v[nod].begin(); it != v[nod].end(); it ++ ) {
                if ( !vizitat[*it] ) {
                    dq.push_back( *it );
                    dist[*it] = min( dist[nod] + 1, dist[*it] );
                }
            }
        }
        dq.pop_front();
    }
    for ( i = 1; i <= n; i ++ ) {
        if ( i == k )
            fprintf( fout, "0 " );
        else if ( dist[i] == 1000000 )
            fprintf( fout, "-1 " );
        else
            fprintf( fout, "%d ", dist[i] );
    }
    return 0;
}