Informatică, întrebare adresată de grecualex10, 8 ani în urmă

Problema #591 Firma
De pe pbinfo

Cerința

Într-o țară sunt n orașe, numerotate de la 1 la n, unite între ele prin m șosele bidirecționale de lungimi cunoscute, între oricare două orașe existând drum, fie șosea directă, fie prin alte orașe. O firmă dorește să-și stabilească sediul în unul dintre orașe, astfel încât suma lungimilor drumurilor minime de la orașul în care se află sediul la toate celelaltele orașe să fie minimă. Determinați orașul care va fi ales pentru sediul firmei. Dacă sunt mai multe orașe care pot fi alese, se va alege cel cu numărul de ordine mai mic.

Date de intrare
Fișierul de intrare firma.in conține pe prima linie numerele n m, iar următoarele m linii câte trei numere i j L, cu semnificatia: între orașele i și j există o șosea directă de lungime L.

Date de ieșire
Fișierul de ieșire firma.out va conține pe prima linie numărul X, reprezentând numărul de ordine al orașului care va ales ca sediu pentru firmă.

Restricții și precizări
1 ≤ n ≤ 100

Răspunsuri la întrebare

Răspuns de radu9614
2

Răspuns:

#include <fstream>

#include <queue>

#include <climits>

using namespace std;

ifstream fin( "firma.in" );

ofstream fout( "firma.out" );

bool                viz[ 101 ];

int                 dist[ 101 ], mat[ 101 ][ 101 ], n = 0, m = 0;

struct nod

{

   int             cost = 0;

   int             x = 0;

   bool operator<( const nod& rhs ) const

   {

       return cost > rhs.cost;

   }

};

priority_queue <nod> q;

void showqueue()

{

   while( !q.empty() )

   {

       fout << q.top().x << " " << q.top().cost << " ";

       q.pop();

   }

}

void dijkstra( int start )

{

   for( int i = 1; i <= n; ++i )

   {

       viz[ i ] = false;

       if( mat[ start ][ i ] != INT_MAX )

       {

           dist[ i ] = mat[ start ][ i ];

           nod             a;

           a.cost = dist[ i ];

           a.x = i;

           q.push( a );

       }

       else

       {

           dist[ i ] = INT_MAX;

       }

   }

   dist[ start ] = 0;

   viz[ start ] = true;

   while( !q.empty() )

   {

       nod             a;

       a = q.top();

       q.pop();

       viz[ a.x ] = true;

       for( int i = 1; i <= n; ++i )

       {

           if( !viz[ i ] && mat[ a.x ][ i ] != INT_MAX && dist[ i ] >= dist[ a.x ] + mat[ a.x ][ i ] )

           {

               dist[ i ] = dist[ a.x ] + mat[ a.x ][ i ];

               nod             curent;

               curent.x = i;

               curent.cost = dist[ i ];

               q.push( curent );

           }

       }

   }

}

int main()

{

   fin >> n >> m;

   for( int i = 1; i <= n; ++i )

   {

       for( int j = 1; j <= n; ++j )

       {

           mat[ i ][ j ] = INT_MAX;

       }

   }

   int             x = 0, y = 0, cost = 0, minim = 100000, indice = 0;

   for( int i = 1; i <= m; ++i )

   {

       fin >> x >> y >> cost;

       mat[ x ][ y ] = cost;

       mat[ y ][ x ] = cost;

   }

   for( int i = 1; i <= n; ++i )

   {

       int             suma = 0;

       dijkstra( i );

       for( int j = 1; j <= n; ++j )

       {

           suma += dist[ j ];

       }

       if( suma < minim )

       {

           minim = suma;

           indice = i;

       }

   }

   fout << indice;

   return 0;

}

Explicație:


grecualex10: Mulțumesc!!
radu9614: Cu placere!
grecualex10: Puteți sa îmi explicați problema, ca am mare nevoie, trebuie sa o prezint urgent ora viitoare.
radu9614: Pai folosim algoritmul dijkstra. Stocam intr-un priority queue, care este ca o coada normala, doar ca este sortata mereu in functie de costul cel mai mare. Avem si un struct in care tinem minte pt un nod costul si indicele, si cam atat este special. In rest doar aplicam dijkstra pe asta si aflam ce ne cere.
Alte întrebări interesante