Pagini recente » Autentificare | Cod sursa (job #2686933) | preoji/clasament/9 | Istoria paginii runda/eusebiu_oji_2014_cls10 | Cod sursa (job #2425381)
#include <fstream>
#include <utility>
#include <climits>
#include <vector>
#include <queue>
#include <list>
using namespace std;
#define mp make_pair
#define ft first
#define sd second
using namespace std;
ifstream fin("apm.in");
ofstream fout("apm.out");
int main(){
int n, m, i, x, y, c;
fin>>n>>m;
vector<list<pair<int, int> > > g(n+1);
list<pair<int, int> > :: iterator it;
for(i=1; i<=m; i++){
fin>>x>>y>>c;
g[x].push_back(mp(y, c));
g[y].push_back(mp(x, c));
}
int total_cost = 0, start_node = 1;
vector<int> dist(n+1, INT_MAX);
dist[start_node] = 0;
priority_queue<pair<int, pair<int, int> > > heap;
heap.push(mp(dist[start_node], mp(0, start_node)));
vector<bool> selected(n+1, false);
list<pair<int, int> > apm;
while(!heap.empty()){
int cost = heap.top().ft;
int prev_node = heap.top().sd.ft;
int curr_node = heap.top().sd.sd;
heap.pop();
if(selected[curr_node] == false){
if(prev_node != 0)
apm.push_back(mp(prev_node, curr_node));
selected[curr_node] = true;
total_cost -= cost;
for(it = g[curr_node].begin(); it != g[curr_node].end(); it++)
if(dist[(*it).ft] > (*it).sd && selected[(*it).ft] == false){
dist[(*it).ft] = (*it).sd;
heap.push(mp(-(*it).sd, mp(curr_node, (*it).ft)));
}
}
}
fout<<total_cost<<endl<<n-1<<endl;
for(it = apm.begin(); it != apm.end(); it++)
fout<<(*it).ft<<" "<<(*it).sd<<endl;
return 0;
}