Cod sursa(job #2149177)

Utilizator HawksCBalota George HawksC Data 2 martie 2018 13:10:00
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <iostream>
#include <fstream>
#include <limits>
#include <fstream>

#define NMAX 50005;
using namespace std;

ifstream f("dijkstra.in");
ofstream g("dijkstra.out");

int n, m;
int a, b, c;
int am[NMAX][NMAX];
int dis[NMAX];
int visited[NMAX];

int dij(int x)
{
    visited[x] = 1;
    //update la celelalte noduri conectate cu nodul x
    for(int i=1;i<=n;i++)
        if((visited[i]==0) && (am[x][i]!=-1))
            if((dis[x]+am[x][i]<dis[i])||(dis[i]==-1))
                dis[i] = dis[x]+am[x][i];
    int smaller = -1, sw = -1;
    for(int i=0;i<=n;i++)
        if((visited[i]==0)&&(dis[i]>=0)&&((sw>dis[i])||(sw==-1)))
        {
            sw = dis[i];
            smaller = i;
        }
    if(smaller!=-1)
    {
        dij(smaller);
        return 0;
    }
    return 0;
}

int main()
{
    f>>n>>m;
    for(int i=0;i<=n;i++)
        for(int j=0;j<=n;j++)
            am[i][j] = -1; //-1 -> nodul nu a fost vizitat
    for(int i=0;i<=n;i++)
        dis[i]=-1; //-1 = infinit
    dis[1] = 0; // distanta de inceput
    while(!f.eof())
    {
        f>>a>>b>>c;
        am[a][b] = c; //distanta dintre cele 2 noduri
        am[b][a] = c;
    }
    dij(1); //dijkstra de la primul nod
    for(int i=2;i<=n;i++)
        cout<<dis[i]<<" ";
    return 0;
}