Cod sursa(job #2086843)

Utilizator BazagazealOancea Eduard Bazagazeal Data 12 decembrie 2017 16:24:25
Problema Algoritmul lui Dijkstra Scor 10
Compilator c Status done
Runda Arhiva educationala Marime 2.73 kb
#include <stdio.h>
#include <stdlib.h>
#define MAX 2147483647
typedef struct _Node
{
    int nod,length;
    struct _Node *next;
}Node;
Node *p[100001];
void adaugare_dupa(Node *p, int valoare, int length)
{
    Node *q=(Node*)malloc(sizeof(Node));
    q->next=p->next;
    q->nod=valoare;
    q->length=length;
    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 : %d) ", q->nod, q->length);
                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 DFS(Node *p[],int nod)
{
    Node *q;
    viz[nod]=1;
    for(q=p[nod]->next;q!=p[nod];q=q->next)
        if(viz[q->data]==0)
            DFS(p,q->data);

}*/

void Dijkstra(int n, FILE *g)
{
    int ok=0,i,poz_cost_minim,vizitat[50001],poz_curenta=1,j,min;
    long long cost[50001];
    for(i=1;i<=n;i++)
    {
        cost[i]=MAX;
        vizitat[i]=0;
    }
    cost[1]=0;
    Node *q;
    while(!ok)
    {
        ok=1;
        min=MAX;
        q=p[poz_curenta]->next;
        vizitat[poz_curenta]=1;
        while(q!=p[poz_curenta])
        {
            if(cost[poz_curenta]+q->length<cost[q->nod])
            {
                cost[q->nod]=cost[poz_curenta]+q->length;
                ok=0;
            }
            q=q->next;
        }
        for(j=1;j<=n;j++)
            if(!vizitat[j] && cost[j]<=min)
            {
                min=cost[j];
                poz_curenta=j;
            }
        for(i=1;i<=n;i++)
            printf("%d ", cost[i] );
        printf("\n");
    }
    for(i=2;i<=n;i++)
    {
        if(cost[i]==MAX)
            cost[i]=0;
        fprintf(g, "%d ", cost[i]);
    }
}
int main()
{
    FILE *f=fopen("dijkstra.in", "r");
    FILE *g=fopen("dijkstra.out", "w");
    int n,m,x,y,i,j,length;
    fscanf(f,"%d %d", &n, &m);
    for(i=1;i<=n;i++)
    {
        p[i]=(Node*)malloc(sizeof(Node));
        p[i]->next=p[i];
        p[i]->nod=0;
    }
    for(i=0;i<m;i++)
    {
        fscanf(f,"%d%d%d", &x ,&y, &length);
        adaugare_dupa(p[x],y, length);
    }
    Dijkstra(n,g);
   // for(i=1;i<=n;i++)
        //show(p[i],g);
    return 0;
}