Cod sursa(job #1762562)

Utilizator cldmeClaudiu Ion cldme Data 23 septembrie 2016 19:10:12
Problema BFS - Parcurgere in latime Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 kb
#include <cstdio>
using namespace std;

int const N = 100001; //number of nodes
int const M = 1000001; //number of edges

int nodes[M], next[M], last[N], nr;
int q[N], cost[N];
bool visited[N];

void addEdge(int x, int y)
{
    nodes[++nr] = y;
    next[nr] = last[x];
    last[x] = nr;
}

void printEdge(int p)
{
    printf("%d -> ",p);
    p = last[p];
    while(p != 0)
    {
        printf("%d ",nodes[p]);
        p = next[p];
    }
    printf("\n");
}

void bfs(int p)
{
    int start = 1, finish = 1, pos, x;
    q[1] = p;
    visited[p] = true;
    cost[p] = 0;

    while(start <= finish)
    {
        p = q[start++];
        pos = last[p];
        while(pos != 0)
        {
            x = nodes[pos];
            if(!visited[x] && cost[x] == 0)
            {
                cost[x] = cost[p] + 1;
                visited[x] = true;
                q[++finish] = x;
            }
            pos = next[pos];
        }
    }
}

void dfs(int p)
{
    int pos,x;
    visited[p] = true;
    pos = last[p];

    while(pos != 0)
    {
        x = nodes[pos];
        if(!visited[x])
        {
            cost[x] = cost[p] + 1;
            dfs(x);
        }
        pos = next[pos];
    }
}

int main()
{
    int i,n,m,p,x,y;
    freopen("bfs.in","r",stdin);
    freopen("bfs.out","w",stdout);
    scanf("%d %d %d",&n,&m,&p);

    for(i = 1; i <= m; i++)
    {
        scanf("%d %d",&x,&y);
        addEdge(x,y);
    }

    bfs(p);
    //dfs(p);

    for(i = 1; i <= n; i++)
    {
        if(!visited[i]) printf("-1 ");
        else printf("%d ",cost[i]);
    }
    return 0;
}