Cod sursa(job #1133094)

Utilizator span7aRazvan span7a Data 4 martie 2014 13:44:55
Problema Algoritmul lui Dijkstra Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include<fstream>
#define M 2000000000
using namespace std;
ifstream f("dijkstra.in");
ofstream g("dijkstra.out");
struct nod
{
  int inf,c;
  nod* leg;

};
typedef nod* PNod;
PNod L[50001];
int cost[50001],viz[50001],n,m;
void add(int x,int y,int z)
{
    PNod p=new nod;
    p->inf=y;
    p->c=z;
    p->leg=L[x];
    L[x]=p;
}
void citire()
{
    int i,x,y,z;
    f>>n>>m;
    for(i=1;i<=m;i++)
     {
       f>>x>>y>>z;
        add(x,y,z);
     }

}
void completeaza()
{
    for(int i=2;i<=n;i++)
        cost[i]=M;
    PNod p;
    for(p=L[1];p;p=p->leg)
        cost[p->inf]=p->c;
}
void afisare()
{
    for(int i=2;i<=n;i++)
        if(cost[i]==M)
            g<<"0 ";
        else g<<cost[i]<<" ";
}
void dijkstra()
{
    completeaza();
    int poz,valmin,i,j;
    PNod p;
    viz[1]=1;
    for(i=1;i<=n-1;i++)
    {
        valmin=M;
        for(j=2;j<=n;j++)
            if(viz[j]==0&&cost[j]<valmin)
            {
                valmin=cost[j];
                poz=j;
            }
        viz[poz]=1;
        for(p=L[poz];p;p=p->leg)
                if(!viz[p->inf]&&cost[p->inf]>cost[poz]+p->c)
                    cost[p->inf]=cost[poz]+p->c;
    }
    afisare();
}
int main()
{
    citire();
    dijkstra();
    return 0;
}