Cod sursa(job #1267687)

Utilizator serban.cobzacCobzac Serban serban.cobzac Data 20 noiembrie 2014 08:55:57
Problema Algoritmul lui Dijkstra Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.96 kb
#include <cstdio>
#include <vector>
#define nmax 50005
#define INF (50000*1000)
using namespace std;
FILE*fin=fopen("dijkstra.in", "r");
FILE*fout=fopen("dijkstra.out", "w");

int n, m, x0;
struct vecin{
    int vf;
    short cost;
};
vector <vecin> gr[nmax];
int cmin[nmax], prec[nmax];
bool uz[nmax];

void citire();
void init();
void dijkstra(int);
void afisare();

int main(){
    citire();
    x0=1; //in cazul de pe infoarena
    init();
    dijkstra(x0);
    afisare();
    return 0;
}

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

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

void dijkstra(int vfS){
    int i;
    for(i=0; i<gr[vfS].size(); ++i){
        cmin[gr[vfS][i].vf]=gr[vfS][i].cost;
        prec[gr[vfS][i].vf]=vfS;
    }

    int minim, vfMin, j;
    vecin y;
    for(i=1; i<=n-1; ++i){
        //determin un vf neselectat de cost minim
        minim=vfMin=INF;
        for(j=1; j<=n; ++j)
            if(minim>cmin[j] && !uz[j]){
                minim=cmin[j];
                vfMin=j;
            }
        if(vfMin==INF) break;
        uz[vfMin]=1;
        for(j=0; j<gr[vfMin].size(); ++j){
            y=gr[vfMin][j];
            if(!uz[y.vf] && cmin[y.vf]>cmin[vfMin]+y.cost){
                cmin[y.vf]=cmin[vfMin]+y.cost;
                prec[y.vf]=vfMin;
            }
        }
    }
}

void afisare(){
    for(int i=1; i<=n; ++i)
        if(i!=x0){
            if(cmin[i]!=INF) fprintf(fout, "%d ", cmin[i]);
            else fprintf(fout, "0 ");
        }
    fprintf(fout, "\n");
}