Cod sursa(job #2143011)

Utilizator AcuasPopescu Nicolae-Aurelian Acuas Data 25 februarie 2018 14:42:08
Problema BFS - Parcurgere in latime Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <cstdlib>
#include <cstring>

using namespace std;

void read(int &n, int &m, int &S, vector<int> **G) {
    ifstream f("bfs.in");
    if(!f.is_open()){
        cout<<"The file can't be opened!\n";
        exit(EXIT_FAILURE);
    }
    f>>n>>m>>S;
    *G = new vector<int>[(n + 1) * sizeof(vector<int> *)];
    int x, y;
    for(int i = 0; i < m; ++i) {
        f>>x>>y;
        (*G)[x].push_back(y);
    }

    f.close();
}

void BFS(int n, int x, vector<int> *G,int *vis, int *father) {
    queue<int> Q;
    Q.push(x);
    vis[x] = 1;

    while(!Q.empty()) {
        int aux = Q.front();
        Q.pop();
        for(vector<int>::iterator it = G[aux].begin(); it != G[aux].end(); ++it){
            if(!vis[*it]) {
                vis[*it] = 1;
                Q.push(*it);
                father[*it] = aux;
            }
        }
    }
}

int path(int x, int *father) {
    if(father[x])
        return 1 + path(father[x], father);
    else
        return 0;


}

int main() {
    int n, m, S;
    vector<int> *G;
    read(n, m, S, &G);
    int *vis = new int[(n + 1) * sizeof(int)];
    int *father = new int[(n + 1) * sizeof(int)];
    memset(vis, 0, (n + 1) * sizeof(int));
    memset(father, 0, (n + 1) * sizeof(int));
    BFS(n, S, G, vis, father);
    ofstream g("bfs.out");
    if(!g.is_open()){
        cout<<"The file can't be opened!\n";
        exit(EXIT_FAILURE);
    }
    for(int i = 1; i <= n; ++i) {
        if(!vis[i]) {
            g<<"-1 ";
        }
        else if(vis[i] && i == S) {
            g<<"0 ";
        }
        else
            g<<path(i, father)<<' ';
    }
    g.close();
    delete[] vis;
    delete[] father;
    return 0;
}