Cerința
Se dă un graf neorientat ponderat conex cu n
vârfuri și m
muchii – în care fiecare muchie are asociat un cost, număr natural strict pozitiv. Folosind algoritmul lui Prim, determinați un arbore parțial de cost minim, cu rădăcina în vârful 1
.
Date de intrare
Fișierul de intrare prim.in
conține pe prima linie numerele n m
, iar următoarele linii câte un triplet i j c
, cu semnificația: există muchia (i j)
și are costul c
.
Date de ieșire
Fișierul de ieșire prim.out
va conține pe prima linie costul arborelui de cost minim determinat, iar pe a doua linie vectorul de tați al arborelui, cu elementele separate prin exact un spațiu.
Restricții și precizări
1 ≤ n ≤ 100
- costul unei muchii va fi mai mic decât
1000
Exemplu
prim.in
7 11 1 2 2 1 7 4 2 3 3 2 5 2 2 6 3 2 7 3 3 4 1 3 5 2 4 5 1 5 6 3 6 7 5
prim.out
12 0 1 4 5 2 2 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 Prim:
#include <iostream>
#include <fstream>
#define INFINIT 1000000000
using namespace std;
ifstream fin("prim.in");
ofstream fout("prim.out");
int n , a[105][105], v[105], d[105], t[105];
int main()
{
int i , j , c , m;
fin >> n >> m;
for(i =1 ; i <= n ; ++i){
for(j = 1 ; j <= n ; ++j)
a[i][j] = INFINIT;
a[i][i] = 0;
}
while( m )
{
fin >> i >> j >> c;
a[j][i] = a[i][j] = c;
m --;
}
for(i =1 ; i <= n ; i ++ )
{
v[i] = 0;
d[i] = a[1][i];
t[i] = 1;
}
v[1] = 1; // vectorul de vizitati
t[1] = 0; //vectorul de tati
d[1] = 0; // vectorul cu costurile
d[0] = INFINIT;
for(int k = 1 ; k < n ; ++k)
{
int pmax = 0;
// alegem un varful nevizitat care se leaga de arborele curent cu cost minim
for(i = 1 ; i <= n ; ++i)
if(v[i] == 0 && d[i] < d[pmax])
pmax = i;
if(pmax > -1)
{
v[pmax] = 1;
// verificam daca varful adaugat in arbore nu imbunatateste costurile de legare la arbore a varfurilor inca nevizitate
for(i = 1; i <= n ; ++i)
if(v[i] == 0 && d[i] > a[pmax][i])
d[i] = a[pmax][i], t[i] = pmax;
}
}
int S = 0;
for(i = 1 ; i <= n ; ++i)
S += d[i];
fout << S << endl;
for(i = 1 ; i <= n ; ++i)
fout << t[i] << " ";
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 #590 Prim
Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #590 Prim 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!