Cod sursa(job #742938)

Utilizator galbenugalbenu dorin galbenu Data 2 mai 2012 09:34:53
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include<iostream>
#include<fstream>
#include<cstring>
#include<vector>
#include<cstdio>
#define lmax 50050
#define INFINIT 0x3f3f3f3f
using namespace std;
struct nod
{
    int inf;
    nod *urm;
};
vector<pair <int,int> > L[lmax];
FILE *f=fopen("dijkstra.in","r"),*g=fopen("dijkstra.out","w");
int D[lmax],n,m,inc=1;
bool viz[lmax];
void init_D(int inc)
{
    int i;
    for(i=1; i<=n; i++)
        if(i!=inc)
            D[i]=INFINIT;
}
void read()
{
    int i,x;
    pair<int,int> y,yy;
    fscanf(f,"%d %d",&n,&m);
    for(i=1; i<=m; i++)
        fscanf(f,"%d %d %d",&x,&y.first,&y.second),L[x].push_back(y);
}
int extract_min()
{
    int i,minim=INFINIT,best=0;
    for(i=1; i<=n; i++)
        if(D[i]<minim && !viz[i])
            minim=D[i],best=i;
    viz[best]=1;
    return best;
}
bool viz_check()
{
    int i;
    for(i=1; i<=n; i++)
        if(!viz[i])
            return 1;
    return 0;
}
void update_dist(int x)
{
    unsigned int i;
    for(i=0; i<L[x].size(); i++)
        if(D[x]+L[x][i].second<D[L[x][i].first])
            D[L[x][i].first]=D[x]+L[x][i].second;
}
void Djikstra()
{
    int muchie=1;
    init_D(inc);
    while(muchie)
    {
        muchie=extract_min();
        update_dist(muchie);
    }
}
void show_sol()
{
    unsigned int i;
    for(i=2; i<=n; i++)
        fprintf(g,"%d ",D[i]);
}
int main()
{
    read();
    Djikstra();
    show_sol();
    fclose(f);
    fclose(g);
    return 0;
}