Pagini recente » Cod sursa (job #2109832) | Cod sursa (job #2618738) | Cod sursa (job #1490389) | Cod sursa (job #2068212) | Cod sursa (job #2861548)
#include <fstream>
#include <vector>
#define INF 2000000001
using namespace std;
ifstream f("apm.in");
ofstream g("apm.out");
int cost[200011],coord[200011],arb[200011],n;
void insus(int k)
{
if(k==1)
return;
if(cost[arb[k]]<cost[arb[k/2]])
{
swap(coord[arb[k]],coord[arb[k/2]]);
swap(arb[k],arb[k/2]);
insus(k/2);
}
}
void injos(int k)
{
int x=k*2;
if(x>n)
return;
if(x+1<=n && cost[arb[x+1]]<cost[arb[x]])
x++;
if(cost[arb[k]]>cost[arb[x]])
{
swap(coord[arb[k]],coord[arb[x]]);
swap(arb[k],arb[x]);
injos(x);
}
}
vector <pair<int,int>> v[200011];
int m,x,y,z,i,k,S,muc[200011],N;
int main()
{
f>>n>>m;
N=n;
for(i=2;i<=n;i++)
{
cost[i]=INF;
coord[i]=arb[i]=i;
}
arb[1]=coord[1]=1;
for(i=1;i<=m;i++)
{
f>>x>>y>>z;
v[x].push_back(make_pair(y,z));
v[y].push_back(make_pair(x,z));
}
while(n)
{
k=arb[1];
coord[arb[1]]=1;
arb[1]=arb[n];
n--;
injos(1);
S=S+cost[k];
for(i=0;i<v[k].size();i++)
{
if(cost[v[k][i].first]>v[k][i].second)
{
cost[v[k][i].first]=v[k][i].second;
muc[v[k][i].first]=k;
insus(coord[v[k][i].first]);
}
}
}
g<<S<<'\n'<<N-1<<'\n';
for(i=2;i<=N;i++)
g<<i<<" "<<muc[i]<<'\n';
return 0;
}