Pagini recente » Cod sursa (job #895096) | Cod sursa (job #1538926) | Cod sursa (job #2245972) | Cod sursa (job #1619521) | Cod sursa (job #2940349)
#include <fstream>
#include <bits/stdc++.h>
using namespace std;
ifstream f("apm.in");
ofstream g("apm.out");
#define MAXN 100001
#define infinite 1e9
int main()
{
int n,m,cost,x,y;
f>>n>>m;
vector<vector<pair<int,int>>>lista;
for(int i = 0;i<n+1;i++)
lista.push_back({});
for(int i = 0;i<m;i++)
{
f>>x>>y>>cost;
lista[x].push_back({y, cost});
lista[y].push_back({x,cost});
}
vector<int> distante(n+1,infinite);
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> pq;
int nrMuchii = 0;
pq.push({0,1});
vector<bool> inArbore(n+1,false);
inArbore[1] = true;
int costTotal = 0;
vector<pair<int,int>> muchii;
distante[1] =0;
vector<int>tata(n+1,0);
for(int i = 1;i<=n;i++)
{
int nodCurent = pq.top().second;
int costNodCurent = pq.top().first;
if(nodCurent!= 1) {
muchii.push_back({nodCurent, tata[nodCurent]});
nrMuchii++;
}
pq.pop();
for(int j = 0;j<lista[nodCurent].size();j++)
if(inArbore[lista[nodCurent][j].first] == false && distante[lista[nodCurent][j].first]>lista[nodCurent][j].second)
{
distante[lista[nodCurent][j].first] = lista[nodCurent][j].second;
tata[lista[nodCurent][j].first] = nodCurent;
pq.push({ distante[lista[nodCurent][j].first],lista[nodCurent][j].first});
}
inArbore[nodCurent] = true;
}
for(int i = 1;i<distante.size();i++)
costTotal += distante[i];
g<<costTotal<<endl;
g<<nrMuchii<<endl;
for(auto muchie:muchii)
g<<muchie.first<<' '<<muchie.second<<endl;
f.close();g.close();
}