Pagini recente » Cod sursa (job #1455594) | Cod sursa (job #3149637) | Cod sursa (job #125692) | Cod sursa (job #2153918) | Cod sursa (job #2846756)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream fin ("apm.in");
ofstream fout ("apm.out");
int main()
{
int n,m,a,b,c,finalcost;
fin>>n>>m;
vector<vector<pair<int,int>>> v(n+1); //.first-vertex;.second-cost
priority_queue<pair < int, pair<int,int> > ,vector<pair < int, pair<int,int> >>,greater<pair < int, pair<int,int> >> > q;
while(m)
{
m--;
fin>>a>>b>>c;
v[a].push_back(make_pair(b,c));
v[b].push_back(make_pair(a,c));
}
finalcost=0;
bool visited[n+1];
visited[1]=1;//start from 1
for(int i=2;i<=n;i++)
visited[i]=0;
for(int i=0;i<v[1].size();i++)
{
q.push(make_pair(v[1][i].second,make_pair(1,v[1][i].first)));
}
pair < int, pair<int,int> > actualedge;
vector<pair<int,int>>res;
for(int i=1;i<n;i++) //add n-1 vertexes
{
actualedge=q.top();
q.pop();
while(visited[actualedge.second.second])
{
actualedge=q.top();
q.pop();
}
visited[actualedge.second.second]=1;
finalcost+=actualedge.first;
res.push_back(make_pair(actualedge.second.first,actualedge.second.second));
for(int j=0;j<v[actualedge.second.second].size();j++)
{
if(visited[v[actualedge.second.second][j].first]==0)
q.push(make_pair(v[actualedge.second.second][j].second,make_pair(actualedge.second.second,v[actualedge.second.second][j].first)));
}
}
fout<<finalcost<<'\n'<<n-1<<'\n';
for(auto i=res.begin();i<res.end();i++)
fout<<(*i).first<<" "<<(*i).second<<'\n';
return 0;
}