Cod sursa(job #2264512)

Utilizator Raul09062000Ianos Raul-Daniel Raul09062000 Data 20 octombrie 2018 10:11:24
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.56 kb
#include <iostream>
#include <fstream>
#define infinit 1000000000
using namespace std;
ifstream fin("dijkstra.in");
ofstream fout("dijkstra.out");
int cost[101][101],n,p,viz[101],lung[101],tata[101],i,j,c,k,ok,minim;
int main()
{
    fin>>n>>p;
    //se construieste matricea costurilor
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
          cost[i][j]=infinit;
    while(fin>>i>>j>>c)
        cost[i][j] = c;
    //se fac initializarile
    for(i=1;i<=n;i++)
    {
        tata[i] = p;
        lung[i] = cost[p][i];
    }
    //se marcheaza ca vizitat nodul de plecare
    viz[p] = 1;
    lung[p] = 0;
    tata[p] = 0;
    ok=1;
    while(ok)
    {    //se cauta urmatorul nod prin care sa se treaca
         minim = infinit;
         //se alege nodul care nu a mai fost vizitat pentru care lungimea este minima
         for(i=1;i<=n;i++)
            if(!viz[i] && lung[i]<minim)
            {
                minim=lung[i];
                k=i;
            }
         //daca s-a gasit un astfel de nod, se actualizeaza drumurile catre toate nodurile care n-au fost inca vizitate
         if(minim!=infinit)
         {
             viz[k] = 1;
             for(i=1;i<=n;i++)
                if(!viz[i]&&lung[i]>lung[k]+cost[k][i])
             {
                 lung[i] = lung[k]+cost[k][i];
                 tata[i] = k;
             }
         }
         else ok=0;
    }
    for(i=1;i<=n;i++)
        if(lung[i]==infinit)
          fout<<-1<<" ";
        else fout<<lung[i]<<" ";
    fin.close();
    fout.close();

    return 0;
}