Cod sursa(job #1446313)

Utilizator EfraimBEfraim Budusan EfraimB Data 1 iunie 2015 14:19:26
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include <iostream>
#include <fstream>

using namespace std;

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

struct Graf {
    int nr_noduri;
    int nr_arce;
    int A[100][100];
};

void Citire_Graf ( Graf & X )
{
    f>>X.nr_noduri;
    f>>X.nr_arce;
    int i , x , y, z;
    for(i=1;i<=X.nr_noduri;i++)
    {
        f>>x>>y>>z;
        X.A[x][y]=z;
    }

}

void Afis ( Graf X )
{
    int i ,j;
    for(i=1;i<=X.nr_noduri;i++)
    { for(j=1;j<=X.nr_noduri;j++)
           g<<X.A[i][j]<<" ";
           g<<endl;
    }
}

void afisare (int nx ,  int x[])
{
    int i;
    for(i=2;i<=nx;i++)
        g<<x[i]<<" ";
        g<<endl;

}


void Distance_To_Vertexes ( int source , Graf X )
{
    int * visited , *costs;
    int minim;
    visited = new int[X.nr_noduri];
    costs = new int[X.nr_noduri];

    //Init

    int i;
    for (i=1;i<=X.nr_noduri;i++)
    {
        visited[i]=0;
        costs[i]=10000;
    }

    costs[source]=0;

   bool ok =true;
   while ( ok)
   {
       minim=10000;
       for(i=1;i<=X.nr_noduri;i++)
       {
           if(visited[i]==0 && costs[i]<minim)
           {
               minim=costs[i];
               source=i;
           }
       }
      if( minim<10000)
      {
       visited[source]=1;
       for(i=1;i<=X.nr_noduri;i++)
       {
           if( X.A[source][i]!=0)
           {
               if( (costs[source]+ X.A[source][i] )< costs[i] ) costs[i]=costs[source]+ X.A[source][i];
           }
       }

      } else ok=0;
   }

   afisare( X.nr_noduri , costs);

}





int main()
{
    Graf graf_a;
    Citire_Graf(graf_a );
    Distance_To_Vertexes(1 , graf_a);
    return 0;
}