Pagini recente » Cod sursa (job #2880358) | Cod sursa (job #3167478) | Cod sursa (job #1689383) | Cod sursa (job #2705124) | Cod sursa (job #806763)
Cod sursa(job #806763)
#include<fstream>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;
ifstream in("apm.in");
ofstream out("apm.out");
struct muchie{
int vf;
int cost;
};
muchie makeMuchie(int a , int b)
{
muchie x;
x.vf=a;
x.cost=b;
return x;
}
const int N = 200001;
const int INF= 1001;
vector <muchie> a[N];
priority_queue < pair<int,int> > minHeap;
int d[N],marcat[N],pred[N],cost,n,m,x,y,c;
int main()
{
in>>n>>m;
for(int i=1;i<=m;i++)
{
in>>x>>y>>c;
a[x].push_back(makeMuchie(y,c));
a[y].push_back(makeMuchie(x,c));
}
for(int i=2;i<=n;i++)
d[i]=INF;
minHeap.push(make_pair(0,1));
for(int i=2;i<=n;i++)
{
while(marcat[minHeap.top().second])
minHeap.pop();
cost+=minHeap.top().first;
int x=minHeap.top().second;
marcat[x]=1;
minHeap.pop();
for(int i=0;i<a[x].size();i++)
{
int dist=a[x][i].cost;
if(dist<d[a[x][i].vf])
{
d[a[x][i].vf]=dist;
pred[a[x][i].vf]=x;
minHeap.push(make_pair(-dist,a[x][i].vf));
}
}
}
while(marcat[minHeap.top().second])
minHeap.pop();
cost+=minHeap.top().first;
out<<-cost<<"\n"<<n-1<<"\n";
for(int i=2;i<=n;i++)
out<<i<<" "<<pred[i]<<"\n";
return 0;
}