Pagini recente » Cod sursa (job #2084230) | Cod sursa (job #2961112) | Cod sursa (job #95820) | Cod sursa (job #2219073) | Cod sursa (job #2419442)
#include <iostream>
#include <queue>
#include <vector>
#include <fstream>
using namespace std;
ifstream f("apm.in");
ofstream g("apm.out");
#define inf 10000
#define NMAX 200003
vector< int > graph[NMAX], graphC[NMAX];
priority_queue <pair <int, pair<int, int> > > myheap;
pair <int, pair<int, int> > best;
int n, m, dist[NMAX], viz[NMAX], tata[NMAX], cost, sursa, i, index, nrMuchii;
void citire()
{
f>>n>>m;
for(int i = 0; i < m; i ++)
{
int a, b, c;
f>>a>>b>>c;
/// muchie de la a->b
graph[a].push_back(b);
graph[b].push_back(a);
/// costul muchiei de la a->b
graphC[a].push_back(c);
graphC[b].push_back(c);
}
}
pair<int, int> muchie;
pair<int, int> arbore[10000];
void algoritmPrim(){
cost = 0;
sursa = 1;
viz[sursa] = 1;
tata[sursa] = 0;
for(i = 2; i <= n; i ++)
tata[i] = sursa;
for(i = 0; i < graph[sursa].size(); i ++)
myheap.push(make_pair(-graphC[sursa][i], make_pair(sursa,graph[sursa][i])));
while(!myheap.empty()){
best = myheap.top();
myheap.pop();
muchie = best.second;
int nod2 = muchie.second;
int nod1 = muchie.first;
//cout<< nod1<< " "<< nod2<< " "<< -best.first<<endl;
if(viz[nod2] == 0)
{
tata[nod2] = nod1;
cost += (-best.first);
nrMuchii++;
viz[nod2] = 1;
for(int j = 0; j < graph[nod2].size(); j ++)
myheap.push(make_pair(-graphC[nod2][j], make_pair(nod2,graph[nod2][j])));
};
}
}
void afisare(){
g<<cost<<endl;
g<< nrMuchii <<endl;
for(int i = 2; i <= n; i ++)
g<< i<< " "<<tata[i]<<endl;
}
int main()
{
citire();
algoritmPrim();
afisare();
return 0;
}