Cod sursa(job #1267681)

Utilizator AndreiTimofteAndrei Timofte AndreiTimofte Data 20 noiembrie 2014 08:47:20
Problema Algoritmul lui Dijkstra Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 kb
#include <cstdio>
#include <vector>
#define NMAX 50005
#define MMAX 250005
#define INF 1000000000

using namespace std;

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

struct vecin
{
    int vf;
    short int c;
};

vector <vecin> G[NMAX];
int cmin[NMAX],prec[NMAX];
bool z[NMAX];
int n,m,x0=1;

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

void init()
{
int i;
z[x0]=1;
for (i=1;i<=n;i++)
     {
      prec[i]=x0;
      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 dijkstra()
{
int i,minim,vfmin,j;
for (i=1;i<=n-1;i++)
    {
     minim=INF; vfmin=INF;
     ///determin un varf neselectat de cost minim
     for (j=1;j<=n;j++)
          if (minim>cmin[j] && z[j]==0 ) minim=cmin[j],vfmin=j;
     if (vfmin==INF) break;
     z[vfmin]=1;
     for (j=0;j<G[vfmin].size();j++)
          if (z[ G[vfmin][j].vf ]==0 && cmin[G[vfmin][j].vf]>cmin[vfmin]+G[vfmin][ /*G[vfmin][j].vf*/j ].c)
              {
               cmin[G[vfmin][j].vf]=cmin[vfmin]+G[vfmin][ j/*G[vfmin][j].vf*/ ].c;
               prec[G[vfmin][j].vf]=vfmin;
              }
    }
}

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

int main()
{
citire();
init();
dijkstra();
afisare();
    return 0;
}