Cod sursa(job #1256573)

Utilizator pintilie.andreiPintilie pintilie.andrei Data 6 noiembrie 2014 16:26:48
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <fstream>
#define INF 1000000

using namespace std;

FILE *fin,*fout;

struct elem {int x;int cost;} M[5010][5010];
int tata[50010],cmin[50010];
int use[50010];

int cost(int a,int b);

int n,m,xs;

int main()
{
    int i,a,b,val,ok,minim,unde;
    fin=fopen("dijkstra.in","r");
    fout=fopen("dijkstra.out","w");
    fscanf(fin,"%d %d",&n,&m);
    for(i=1;i<=n;i++) cmin[i]=INF;
    for(i=1;i<=m;i++)
    {
        fscanf(fin,"%d %d %d",&a,&b,&val);
        M[a][0].x++;
        M[a][M[a][0].x].x=b;
        M[a][M[a][0].x].cost=val;
        M[b][0].x++;
        M[b][M[b][0].x].cost=val;
    }
    ok=1;
    cmin[1]=0;
    while(ok)
    {
        minim=INF;
        for(i=1;i<=n;i++)
        if(!use[i] && minim>cmin[i])
        {
            minim=cmin[i];
            unde=i;
        }
        if(minim!=INF)
        {
            use[unde]=1;
            for(i=1;i<=n;i++)
            {
                val=cost(unde,i);
                if (!use[i] && cmin[i]>cmin[unde]+val)
                {
                    cmin[i] = cmin[unde]+val;
                    tata[i] = unde;
                }
            }
        }
        else ok=0;
    }
    for(i=2;i<=n;i++)
        fprintf(fout,"%d ",cmin[i]);
    fprintf(fout,"\n");
    return 0;
}

int cost(int a, int b)
{
    int i;
    for(i=1;i<=M[a][0].x;i++)
        if(M[a][i].x==b)
            return M[a][i].cost;
    return INF;
}