Cod sursa(job #2203670)

Utilizator caiaandrei14Caia Andrei caiaandrei14 Data 12 mai 2018 20:54:54
Problema BFS - Parcurgere in latime Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <stdio.h>
#include <vector>
#include <queue>
#define inf 999999999

using namespace std;

int nrv, nrm, s;

vector < vector <int > > adia; 
vector <char> culori;
vector <int> parinte, distanta;
queue<int> coada;

void citire();
void bfs();
void afisare();

int main(){

	citire();
	bfs();
	afisare();
	return 0;
}

void citire(){
	FILE* f = fopen("bfs.in", "r");
	fscanf(f, "%d%d%d", &nrv, &nrm, &s);

	adia.resize(nrv + 10);
	for(int  i = 1; i <= nrv; i++)
		adia[i].push_back(0);

	culori.resize(nrv + 10);
	parinte.resize(nrv + 10);
	distanta.resize(nrv + 10);

	int x, y;
	for(int i = 0; i < nrm; i++){
		fscanf(f, "%d%d", &x, &y);
		adia[x][0]++;
		adia[x].push_back(y);	
	}
	fclose(f);
}

void bfs(){
	for(int u = 1; u <= nrv; u++)
		if(u != s){
			culori[u] = 'a';
			distanta[u] = inf;
			parinte[u] = 0;
		}
	culori[s] = 'g';
	distanta[s] = 0;
	parinte[s] = inf;
	coada.push(s);
	int u = 0;
	while(!coada.empty()){
		u = coada.front();
		for(int v = 1; v <= adia[u][0]; v++){
			if(culori[adia[u][v]] == 'a'){
				culori[adia[u][v]] = 'g';
				distanta[adia[u][v]] = distanta[u] + 1;
				parinte[adia[u][v]] = u;
				coada.push(adia[u][v]);
			}
		}
		coada.pop();
		culori[u] = 'n';
	}
}

void afisare(){
	FILE* f = fopen("bfs.out", "w");
	for(int i = 1; i <= nrv; i++)
		if(distanta[i] != inf)
			fprintf(f, "%d ", distanta[i]);
		else
			fprintf(f, "-1 ");
	
		//fprintf(f, "%c ", culori[i]);
	
	fclose(f); 
}