Cod sursa(job #2085907)

Utilizator BazagazealOancea Eduard Bazagazeal Data 10 decembrie 2017 21:30:03
Problema BFS - Parcurgere in latime Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 2.04 kb
#include <stdio.h>
#include <stdlib.h>
typedef struct _Node
{
    int data;
    struct _Node *next;
}Node;

void adaugare_dupa(Node *p,int valoare)
{
    Node *q=(Node*)malloc(sizeof(Node));
    q->next=p->next;
    q->data=valoare;
    p->next=q;
}

void show(Node *p, FILE *g)
{
    Node *q=p->next;
    if(q==p)
        fprintf(g,"0\n");
        else
        {
            while(q!=p)
            {
                fprintf(g,"%d ", q->data);
                q=q->next;
            }
        fprintf(g,"\n");
        }
}
void edges_to_matrix()
{
    FILE *f=fopen("grafuri.in", "r");
    FILE *g=fopen("grafuri.out", "w");
    int n,m,M[6][6],x,y,i,j;
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            M[i][j]=0;
    fscanf(f,"%d %d", &n, &m);
    for(i=0;i<m;i++)
    {
        fscanf(f,"%d%d", &x, &y);
        M[x][y]=M[y][x]=1;
    }
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=n;j++)
            fprintf(g,"%d ", M[i][j]);
        fprintf(g,"\n");
    }
}

void BFS(Node *p[],int n,int nod,FILE *g)
{
    int L=1,i,j,cost[n],coada[n];
    for(i=1;i<=n;i++)
        cost[i]=-1;
    coada[L]=nod;
    cost[nod]=0;
    Node *q;
    for(i=1;i<=L;i++)
    {
        q=p[coada[i]]->next;
        while(q!=p[coada[i]])
            {
                if(cost[q->data]==-1)
                {
                    coada[++L]=q->data;
                    cost[coada[L]]=cost[coada[i]]+1;
                }
                q=q->next;
            }
    }
    for(i=1;i<=n;i++)
        fprintf(g,"%d ", cost[i]);
}

int main()
{
    FILE *f=fopen("bfs.in", "r");
    FILE *g=fopen("bfs.out", "w");
    int n,m,x,y,i,j,nod;
    Node *p[100001];
    fscanf(f,"%d %d %d", &n, &m, &nod);
    for(i=1;i<=n;i++)
    {
        p[i]=(Node*)malloc(sizeof(Node));
        p[i]->next=p[i];
        p[i]->data=0;
    }
    for(i=0;i<m;i++)
    {
        fscanf(f,"%d%d", &x ,&y);
        adaugare_dupa(p[x],y);
    }
    //for(i=1;i<=n;i++)
      //  show(p[i],g);
    BFS(p,n,nod,g);
    return 0;
}