Cod sursa(job #1206830)

Utilizator an_drey_curentandreycurent an_drey_curent Data 11 iulie 2014 12:23:16
Problema BFS - Parcurgere in latime Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include<stdio.h>
#include<vector>
#include<queue>
#define NMAX 100005
using namespace std;

FILE *in, *out;
int N, M, S;
vector<int> ADJACENCY[NMAX];
queue<int> QUEUE;
bool VISITED[NMAX];
int COST[NMAX];

void openFile(){
	in = fopen("bfs.in","rt");
	out = fopen("bfs.out", "wt");
}

void readFile(){
	fscanf(in, "%d %d %d", &N, &M, &S);
	while (M--){
		int x, y;
		fscanf(in, "%d %d", &x, &y);
		ADJACENCY[x].push_back(y);
	}
}

void initCost(){
	for (int i = 0; i < NMAX - 5; i++){
		COST[i] = NMAX;
	}
}

void bfs(){
	initCost();
	QUEUE.push(S);
	VISITED[S] = 1;
	COST[S] = 0;

	while (QUEUE.size())
	{
		int node = QUEUE.front();
		int adjacencySize = ADJACENCY[node].size();
		for (int i = 0; i < adjacencySize; i++)
		{
			int neighbour = ADJACENCY[node][i];
			if (!VISITED[neighbour]){
				if (COST[neighbour] >= COST[node] + 1){
					QUEUE.push(neighbour);
					VISITED[neighbour] = 1;
					COST[neighbour] = COST[node] + 1;
				}
			}
		}

		QUEUE.pop();
	}
}

void writeResults(){

	for (int i = 1; i <= N; i++)
		if (COST[i] == NMAX)
			fprintf(out, "%d ", -1);
		else
			fprintf(out, "%d ", COST[i]);
}

int main(){
	openFile();
	readFile();
	bfs();
	writeResults();
	return 0;
}