Cod sursa(job #1869884)

Utilizator Coroian_DavidCoroian David Coroian_David Data 6 februarie 2017 11:13:29
Problema BFS - Parcurgere in latime Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include <cstdio>

///Coada circulara
#define MAX 1000000

using namespace std;

FILE *f, *g;

int k;

int urm[1000001];
int nod[1000001];

int lst[100001];
int cost[100001];
bool viz[100001];

int n, m, st;

int c[1000001];

void add(int a, int b)
{
    k ++;

    nod[k] = b;
    urm[k] = lst[a];

    lst[a] = k;
}

void readFile()
{
    f = fopen("bfs.in", "r");

    fscanf(f, "%d%d%d", &n, &m, &st);

    int i;
    int a, b;
    for(i = 1; i <= m; i ++)
    {
        fscanf(f, "%d%d", &a, &b);

        add(a, b);
    }
}

void bfs(int start)
{
    int st = 1;
    int dr = 0;

    c[++ dr] = start;

    cost[start] = 0;

    int cr, p;

    while(st <= dr)
    {
        cr = c[st ++];

        ///Coada circulara
        if(st == MAX + 1)
            st = 1;

        p = lst[cr];

        viz[cr] = 1;

        while(p != 0)
        {
            if(viz[nod[p]] == 0)
            {
                c[++ dr] = nod[p];
                cost[nod[p]] = cost[cr] + 1;

                ///Coada circulara
                if(dr == MAX)
                    dr = 1;
            }

            p = urm[p];
        }
    }
}

void solve()
{
    bfs(st);
}

void printFile()
{
    g = fopen("bfs.out", "w");

    int i;
    for(i = 1; i <= n; i ++)
    {
        if(i != st && cost[i] == 0)
            fprintf(g, "-1 ");

        else
            fprintf(g, "%d ", cost[i]);
    }

    fprintf(g, "\n");

    fclose(f);
}

int main()
{
    readFile();

    solve();

    printFile();

    return 0;
}