Mai intai trebuie sa te autentifici.

Cod sursa(job #1267684)

Utilizator ginjucristiGinju Cristian ginjucristi Data 20 noiembrie 2014 08:50:01
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include <cstdio>
#include <vector>
#define DMAX 50002
#define INF 1000000000

using namespace std;

FILE * fin=fopen("dijkstra.in", "r");

FILE * fout=fopen("dijkstra.out", "w");

struct vecin
{
int vf;
int c;
};
vector<vecin>G[DMAX];

int n, m, x0=1;
int cmin[DMAX], prec[DMAX];
bool Z[DMAX];

void citire();
void init();
void Djkstra();
void write();

int main()
{
    citire();
    init();
    Djkstra();
    write();
    return 0;
}

void Djkstra()
{
    int i, j, vfmin, cost;
    for(i=1;i<=n-1;i++)
    {
        // caut minimul
        vfmin=n+1;
        cost=INF;
        for(j=1;j<=n;j++)
            if(!Z[j]&&cmin[j]<cost)
            {
                cost=cmin[j];
                vfmin=j;
            }
        if(vfmin==n+1)
            return;
        Z[vfmin]=1;
        for(j=0;j<G[vfmin].size();++j)
            if(!Z[G[vfmin][j].vf]&&(cmin[vfmin]+G[vfmin][j].c<cmin[G[vfmin][j].vf]))
            {
                cmin[G[vfmin][j].vf]=cmin[vfmin]+G[vfmin][j].c;
                prec[G[vfmin][j].vf]=vfmin;
            }
    }
}

void init()
{
    int i;
    Z[x0]=1;
    for(i=1;i<=n;i++)
    {
        prec[i]=i;
        cmin[i]=INF;
    }
    prec[x0]=0;
    cmin[x0]=0;
    for(i=0;i<G[x0].size();++i)
    cmin[G[x0][i].vf]=G[x0][i].c;
}

void write()
{
    int i;
    for(i=2;i<=n;i++)
    if(cmin[i]==INF)
        fprintf(fout,"0");
    else
        fprintf(fout,"%d ",cmin[i]);
    fprintf(fout,"\n");
    fclose(fout);
}

void citire()
{
    int i, x, y;
    vecin v;
    fscanf(fin,"%d%d",&n, &m);
    for (i=1;i<=m;i++)
    {
        fscanf(fin,"%d%d%d",&x,&y,&v.c);
        v.vf=y;
        G[x].push_back(v);
    }
}