Cod sursa(job #2891162)

Utilizator WipeBurcea Ionut Wipe Data 17 aprilie 2022 18:33:01
Problema BFS - Parcurgere in latime Scor 0
Compilator c-64 Status done
Runda Arhiva educationala Marime 2.08 kb
#include <stdio.h>
#include <stdlib.h>

typedef struct edge
{
    int leftNode;
    int rightNode;
} edge;

typedef struct graphEdges
{
    edge *edges;
    int numNodes;
    int numEdges;
    int S;
} graphEdges;

int lmax;

graphEdges readGraphEdgeList(const char *fileName)
{
    graphEdges graph;
    graph.numEdges = 0;
    graph.edges = NULL;
    FILE *f = fopen(fileName, "r");
    if (f == NULL)
        return graph;
    if (!feof(f))
    {
        int numNodes;
        fscanf(f, "%d", &numNodes);
        graph.numNodes = numNodes;
        int numEdges;
        fscanf(f, "%d", &numEdges);
        graph.numEdges = numEdges;
        int S;
        fscanf(f, "%d", &S);
        graph.S = S;
    }
    graph.edges = (edge *)malloc((graph.numEdges + 1) * sizeof(edge));
    int k = 1;
    while (!feof(f))
    {
        int left, right;
        fscanf(f, "%d %d", &left, &right);
        graph.edges[k].leftNode = left;
        graph.edges[k].rightNode = right;
        k++;
    }
    fclose(f);
    return graph;
}

void BFS(graphEdges graph, int target, FILE *f)
{
    if (target == graph.S)
    {
        fprintf(f, "%d ", 0);
        return;
    }
    for (int i = 1; i < graph.numEdges; i++)
    {
        if (graph.edges[i].leftNode == graph.S)
        {
            if (graph.edges[i].rightNode == target)
            {
                fprintf(f, "%d ", 1);
                return;
            }
        }
    }
    int saved;
    for (int i = 1; i < graph.numEdges; i++)
    {
        if (graph.edges[i].rightNode == target && graph.edges[i].leftNode == graph.S)
        {
            fprintf(f, "%d ", lmax + 1);
            return;
        }
        if (graph.edges[i].rightNode == target)
        {
            saved = graph.edges[i].leftNode;
            lmax++;
            i = 0;
            target = saved;
        }
    }
    fprintf(f, "%d ", -1);
}

int main(int argc, char *argv[])
{
    graphEdges graph = readGraphEdgeList("bfs.in");
    FILE *f = fopen("bfs.out", "w");
    for (int i = 1; i <= graph.numNodes; i++)
    {
        lmax = 0;
        BFS(graph, i, f);
    }
    fclose(f);
    return 0;
}