Pagini recente » Cod sursa (job #2177474) | Cod sursa (job #876428) | Cod sursa (job #1435051) | Cod sursa (job #2177636) | Cod sursa (job #871641)
Cod sursa(job #871641)
#include <fstream>
#define Infinit 100000000
using namespace std;
ifstream fin("apm.in");
ofstream fout("apm.out");
int n,m,start,val;
int viz[100001],cmin[100001],tata[100001];
int ct;
struct muchie{int vf, c;} G[10001][10001];
void citire();
void init();
void prim();
int detmin(int v[100001],int &val);
void afisare();
int main()
{
citire();
init();
prim();
afisare();
fout.close();
return 0;
}
void citire()
{
int i,x,y,cost;
fin>>n>>m;
start=1;
for(i=1;i<=n;i++)
cmin[i]=Infinit;
cmin[start]=0;
for(i=1;i<=m;i++)
{
fin>>x>>y>>cost;
G[x][0].vf++;
G[x][G[x][0].vf].c=cost; G[x][G[x][0].vf].vf=y;
G[y][0].vf++;
G[y][G[y][0].vf].c=cost; G[y][G[y][0].vf].vf=x;
}
}
void init()
{
int i;
viz[start]=1;
for(i=1;i<=G[start][0].vf;i++) cmin[G[start][i].vf]=G[start][i].c;
for(i=1;i<=n;i++)
if(i!=start) tata[i]=start;
}
void prim()
{
int i,vrf,nrv=n-1,j;
while(nrv)
{
val=Infinit;
vrf=detmin(cmin,val);
viz[vrf]=1;
nrv--;
//fout<<vf<<' '<<tata[vf]<<'\n';
ct+=cmin[vrf];
for(j=1;j<=G[vrf][0].vf;j++)
if(viz[G[vrf][j].vf]==0&&cmin[G[vrf][j].vf]>G[vrf][j].c)
{
cmin[G[vrf][j].vf]=G[vrf][j].c;
tata[G[vrf][j].vf]=vrf;
}
}
}
int detmin(int v[100001],int &val)
{
int i,ind=0;
for(i=1;i<=n;i++)
if(cmin[i]<val&&viz[i]==0)
{
val=cmin[i]; ind=i;
}
return ind;
}
void afisare()
{
int i,ctf=0;
for(i=1;i<=n;i++)
ctf+=cmin[i];
fout<<ct<<'\n';
fout<<n-1<<'\n';
for(i=2;i<=n;i++)
fout<<tata[i]<<' '<<i<<'\n';
}