Pagini recente » Cod sursa (job #3183207) | Cod sursa (job #2114761) | Cod sursa (job #2715829) | Cod sursa (job #2386534) | Cod sursa (job #1883001)
#include <fstream>
#include <queue>
#include <vector>
using namespace std;
ifstream fin("apm.in");
ofstream fout("apm.out");
struct heap
{
int node,father,cost;
}step;
struct cmp
{
bool operator()(const heap &a,const heap &b)
{
return a.cost>b.cost;
}
};
priority_queue<heap,vector<heap>,cmp> Q;
vector<pair<int,int> > H[200001];
vector<pair<int,int> > ::iterator it;
vector<pair<int,int> > edges;
bool used[200001];
int main()
{
int n,m,a,b,i,c,totalcost=0,nod,cost;
fin>>n>>m;
for(i=1;i<=m;i++)
{
fin>>a>>b>>c;
H[a].push_back(make_pair(b,c));
H[b].push_back(make_pair(a,c));
}
for(it=H[1].begin();it!=H[1].end();it++)
{
step.node=it->first;
step.cost=it->second;
step.father=1;
Q.push(step);
}
used[1]=1;
for(i=2;i<=n;i++)
{
while(used[Q.top().node]!=0) Q.pop();
nod=Q.top().node;
cost=Q.top().cost;
edges.push_back(make_pair(Q.top().father,Q.top().node));
used[nod]=1;
totalcost+=cost;
for(it=H[nod].begin();it!=H[nod].end();it++)
{
if(used[it->first]==0)
{
step.father=nod;
step.node=it->first;
step.cost=it->second;
Q.push(step);
}
}
}
fout<<totalcost<<"\n";
for(it=edges.begin();it!=edges.end();it++) fout<<it->first<<" "<<it->second<<"\n";
}