Pagini recente » Termeni si conditii de utilizare a site-ului infoarena | Cod sursa (job #1403936) | Istoria paginii runda/forsen | Cod sursa (job #895997) | Cod sursa (job #831908)
Cod sursa(job #831908)
# include <stdio.h>
# include <vector>
//# include <conio.h>
# define N 1000002
using namespace std;
typedef struct Node {
int id;
vector <int> neighbours;
int dist;
};
Node graph[N];
int source, n, m, k = 0;
int visited[N];
void readGraph () {
FILE *f;
int x, y;
int ok = 0;
f = fopen("bfs.in", "r");
if (!f){
return;
}
fscanf(f, "%i %i %i", &n, &m, &source);
for (int i = 0; i < m; i++) {
fscanf (f, "%i %i",&x, &y);
Node node1 ;
node1.id = x;
ok = 0;
for (int j = 0; j < k; j++){
if (graph[j].id == node1.id){
ok = 1;
graph[j].neighbours.push_back(y);
break;
}
}
if (ok == 0){
graph[node1.id] = node1;
graph[node1.id].neighbours.push_back(y);
graph[node1.id].dist = 0;
k++;
}
}
fclose(f);
}
void printGraph () {
for (int i = 1; i < k; i++){
printf("%i: ", graph[i].id);
for (int j = 0; j < graph[i].neighbours.size(); j++){
printf("%i ", graph[i].neighbours.at(j));
}
printf("\n");
}
}
int bfs (int start, int stop) {
vector <int> queue;
queue.push_back(start);
visited[start] = 1;
while (queue.size() > 0) {
int n = queue.at(0);
queue.erase(queue.begin());
if (n == stop){
//printf("Done !\n");
return graph[n].dist;
}
for (int i = 0; i < graph[n].neighbours.size(); i++){
if (visited[graph[n].neighbours.at(i)] == 0){
visited[graph[n].neighbours.at(i)] = 1;
queue.push_back(graph[n].neighbours.at(i));
graph[graph[n].neighbours.at(i)].dist = graph[n].dist + 1;
}
}
}
return -1;
}
int main () {
readGraph();
//printGraph();
FILE *g = fopen ("bfs.out","w");
//for (int i = 1; i < n + 1; i++){
//visited[i] = 0;
int dist = bfs(source, 1);
fprintf(g,"%i ", dist);
//}
fclose(g);
//getch();
return 0;
}