Pagini recente » Cod sursa (job #117808) | Cod sursa (job #296355) | Cod sursa (job #591690) | Cod sursa (job #117821) | Cod sursa (job #806769)
Cod sursa(job #806769)
#include<fstream>
#include<vector>
#include<queue>
#define N 200001
#define INF 1002
using namespace std;
ifstream in("apm.in");
ofstream out("apm.out");
using namespace std;
struct muchie{
int vf,cost;
};
vector <muchie> a[N];
priority_queue < pair <int,int> > minHeap;
int n,m;
int d[N];
int marcat[N];
int pred[N];
void citire()
{
in>>n>>m;
int x,y,c,i;
for(i=1;i<=m;i++)
{
in>>x>>y>>c;
a[x].push_back((muchie){y,c});
a[y].push_back((muchie){x,c});
}
}
int main()
{
citire();
int i,x,y,dist,cost=0;
for(i=2;i<=n;i++)
d[i]=INF;
minHeap.push(make_pair(0,1));
for(i=2;i<=n;i++)
{
while(marcat[minHeap.top().second])
{
minHeap.pop();
}
x=minHeap.top().second;
cost+=minHeap.top().first;
marcat[x]=1;
minHeap.pop();
for(int i=0;i<a[x].size();i++)
{
y=a[x][i].vf;
dist=a[x][i].cost;
if(dist<d[y]&& !marcat[y])
{
d[y]=dist;
pred[y]=x;
minHeap.push(make_pair(-dist,y));
}
}
}
while(marcat[minHeap.top().second])
minHeap.pop();
cost+=minHeap.top().first;
out<<-cost<<"\n"<<n-1<<"\n";
for(i=2;i<=n;i++)
out<<i<<" "<<pred[i]<<"\n";
return 0;
}