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
Exemplu
firma.in
6 9 1 3 5 1 4 5 1 5 4 2 3 5 2 4 1 2 5 2 3 6 2 4 6 4 5 6 4
firma.out
2
Cum e corect?
cout < "As la info";
cout << "As la info";
cout >> "As la info";
Felicitări! Poți mai mult?
Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.
Greșit, dar nu-i bai!
Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.
Rezolvare
Iată rezolvarea de 100 de puncte pentru problema Firma:
#include <iostream>
#include <fstream>
#define INFINIT 1000000000
using namespace std;
ifstream fin("firma.in");
ofstream fout("firma.out");
int n , a[105][105];
int main()
{
int m;
fin >> n >> m;
for(int i = 1 ; i <= n ; ++i){
for(int j = 1 ; j <= n ; ++j)
a[i][j] = INFINIT;
a[i][i] = 0;
}
while( m )
{
int i , j , c;
fin >> i >> j >> c ;
a[i][j] = a[j][i] = c;
m --;
}
for(int k = 1 ; k <= n ; ++k)
for(int i = 1 ; i <= n ; ++i)
for(int j = 1 ; j <= n ; ++j)
if(a[i][j] > a[i][k] + a[k][j])
a[i][j] = a[i][k] + a[k][j];
/*
for(int i =1 ; i <= n ; ++i)
{
for(int j = 1 ; j <= n ; ++j)
cerr << a[i][j] << " ";
cerr << endl;
}
*/
int pmin =0, smin = INFINIT;
for(int i = 1 ; i <= n ; ++i)
{
int s = 0;
for(int j = 1 ; j <= n ; ++j)
s += a[i][j];
//cerr << s << endl;
if(s < smin)
smin = s, pmin = i;
}
fout << pmin << endl;
return 0;
}
Atenție
Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa .
Rezolvarea problemei #591 Firma
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #591 Firma de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.
Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!