Cod sursa(job #211421)

Utilizator RobytzzaIonescu Robert Marius Robytzza Data 2 octombrie 2008 09:26:06
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.8 kb
#include <fstream>
#define MAX 50010
#define infinit 100000000

using namespace std;

ifstream fin ("dijkstra.in");
ofstream fout ("dijkstra.out");

struct nod
{
    int inf,cost;
    nod *next;
};
typedef struct nod nod;
nod * sir[MAX];

int n,m,vi;
int d[MAX],viz[MAX],T[MAX];

void adauga(int a,int b,int c)
{
    nod *q=new nod;
    q->inf=a;
    q->cost=c;
    q->next=sir[b];
    sir[b]=q;
}

void citire()
{
    fin>>n>>m;
    int a,b,c;
    for (int i=0;i<m;i++)
    {
        fin>>a>>b>>c;
       // adauga(a,b,c);
        adauga(b,a,c);
    }
}
void prima_faza()
{
    for (nod *r=sir[vi];r;r=r->next)
                    if (d[r->inf]==infinit||(d[r->inf]>d[vi]+r->cost))
                    {
                        d[r->inf]=d[vi]+r->cost;
                        T[r->inf]=vi;
                        }
}

void dijkstra()
{
    memset(T,0,sizeof(T));
    memset(viz,0,sizeof(viz));
    for (int i=0;i<=n;i++)
        d[i]=infinit;
    d[vi]=0;
    viz[vi]=1;
    T[vi]=0;
    prima_faza();
    int poz,min;
    while (min!=infinit)
    {
        min=infinit+1;
        for (int i=1;i<=n;i++)
              if (viz[i]==0 && d[i]<min)
              {     min=d[i];
                    poz=i;
              }
        viz[poz]=1;
                for (nod *r=sir[poz];r;r=r->next)
                    if (d[r->inf]==infinit||(d[r->inf]>d[poz]+r->cost))
                    {
                        d[r->inf]=d[poz]+r->cost;
                        T[r->inf]=poz;

                    }
    }
}

void afisare()
{
    for (int i=2;i<=n;i++)
        if (d[i]==infinit)
            fout<<0<<" ";
        else
            fout<<d[i]<<" ";
    fout<<"\n";
}

int main()
{
    vi=1;
    citire();
    dijkstra();
    afisare();
    return 0;
}