Cod sursa(job #1316730)

Utilizator niculescuteodorNiculescu Teodor Vicentiu niculescuteodor Data 14 ianuarie 2015 02:22:25
Problema BFS - Parcurgere in latime Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.85 kb
#include <iostream>
#include <fstream>
#include <cstdlib>

using namespace std;

ifstream f("bfs.in");
ofstream g("bfs.out");

// algrotimul afla distanta cea mai scurta de la s la toate punctele (inslusiv la sine)

int n,s,pas,sf,inc;
long m;

int **matrice = (int**) malloc (100000 * sizeof (int*));
int *parcurgere = (int*) malloc (100000* sizeof (int*));
int *traseu = (int*) malloc (100000 * sizeof (int*));

void citire ()
{
    int x,y;
    f>>n>>m>>s; // n varfuri, m arce , s varful in care trebuie sa se ajunga
    long i;
    for (i=1;i<=m;i++)
    {
        f>>x>>y;
        matrice [x][y] =1;
    }
}

void init ()
{
    int i;
    for (i=1;i<=sf;i++)
        parcurgere [i] = 0;
    for (i=1;i<=n;i++)
        traseu [i] =0;
}

void bfs (int p)
{
    int i;
    inc=1;
    sf=1;
    parcurgere [inc] =s; //
    traseu [s] = 1; // memoreaza faptul ca a trecut prin acel puncte deja si ce valoare avea atunci in el
    pas =0;
    while (inc <=sf )
    {
        int x=parcurgere [inc];
        pas = traseu [x];
        pas ++;
        for (i=1;i<=n;i++)
            if (matrice [x][i])
            {
                if (i==p)
                {
                    g << pas-1 << " ";
                    init (); // reface tot la 0
                    return ;
                }
                else
                if (traseu [i]==0)
                {
                    traseu [i] =pas;
                    sf++;
                    parcurgere [sf] = i;
                }
            }
        inc ++;
    }
    g << -1 << " ";
    init (); // reface tot la 0
}


int main()
{
    int i;
    for (i=1;i<=100000;i++) matrice [i] = (int*) malloc (100000 * sizeof (int));
    citire ();

    for (i=1;i<s;i++)
    bfs (i);
    g << 0 << " ";
    for (i=s+1;i<=n;i++)
    bfs (i);
    return 0;
}