Cod sursa(job #1984791)

Utilizator CiurezAndreiCiurez Marius-Andrei CiurezAndrei Data 25 mai 2017 23:17:47
Problema BFS - Parcurgere in latime Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.54 kb
#include<bits/stdc++.h>

#define maxNumberOfNodes 400100

int numberOfNodes;
int numberOfEdges;
int sourceNode;
int index;
int node1;
int node2;
int queue[ maxNumberOfNodes ];
bool isVisited[ maxNumberOfNodes ];
int D[maxNumberOfNodes];
int left = 1;
int right = 1;
int headQueue;
struct Nodes
{
        int data;
        struct Nodes *next;
};

struct Nodes *addiacencyList[ maxNumberOfNodes ];
struct Nodes *listIterator;

void add_to_list_forward(int node1, int node2)
{
        Nodes *head = new Nodes;
        head -> data = node2;
        head -> next = addiacencyList[node1];
        addiacencyList[node1] = head;


        /*struct Nodes *head2 = malloc(sizeof(struct Nodes));
        head2 -> data = node1;
        head2 -> next = addiacencyList[node2];
        addiacencyList[node2] = head2;*/
}


int main()
{
        //freopen("bfs.in", "r", stdin);
        //freopen("bfs.out", "w", stdout);
        FILE *fin = fopen("bfs.in", "r");
        FILE *fout = fopen("bfs.out", "w");

        //scanf("%d %d %d", &numberOfNodes, &numberOfEdges, &sourceNode);
        fscanf(fin, "%d %d %d", &numberOfNodes, &numberOfEdges, &sourceNode);

        for(index = 1; index <= numberOfEdges; index ++)
        {
                fscanf(fin, "%d %d", &node1, &node2);
                add_to_list_forward(node1, node2);
        }

        queue[left] = sourceNode;
        isVisited[ sourceNode ] = true;
        D[ sourceNode ] = 0;

        while(left <= right)
        {
                headQueue = queue[left];

                for(listIterator = addiacencyList[ headQueue ]; listIterator != NULL; listIterator = listIterator -> next)
                {
                        if( isVisited[ listIterator -> data ] == false)
                        {
                                isVisited[ listIterator -> data ] = true;
                                right = right + 1;
                                queue[right] = listIterator -> data;
                                D[ listIterator -> data] = D[ headQueue ] + 1;
                        }
                }
                left = left + 1;
        }

        for(index = 1; index <= numberOfNodes; index ++)
        {
                if(isVisited[index] == true)
                {
                        fprintf(fout, "%d ", D[index]);
                }
                else
                {
                        fprintf(fout, "-1 ");
                }
        }

       // fclose(stdin);
        //fclose(stdout);


        return 0;
}