Pagini recente » Cod sursa (job #1589847) | Cod sursa (job #279344) | Istoria paginii utilizator/horiamatei | Cod sursa (job #2711745) | Cod sursa (job #2073952)
//APM - Prim - 70 puncte Infoarena
#include <stdio.h>
#include <algorithm>
#define INF 10000
using namespace std;
FILE *f=fopen("apm.in","r");
FILE *g=fopen("apm.out","w");
int c[20001][20001],use[20001],t[20001],cmin[20001],sol[20001][2],n,m,ct;
void citire()
{
int i,j,k,cost;
fscanf(f,"%d %d",&n,&m);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++) c[i][j]=INF;
for(k=1;k<=m;k++)
{fscanf(f,"%d %d %d",&i,&j,&cost);
c[i][j]=c[j][i]=cost;
}
fclose(f);
}
void prim(int x)
{
int i,j,k,mn,p;
for(i=1;i<=n;i++)
{cmin[i]=c[x][i];
t[i]=x;
}
use[x]=1;
for (k=1;k<n;k++)
{ mn=INF;
for(i=1;i<=n;i++)
if (!use[i] && cmin[i]<mn)
{
mn=cmin[i];
p=i;
}
if (mn==INF) break;
use[p]=1;
ct+=cmin[p];
sol[k][0]=t[p];
sol[k][1]=p;
for(i=1;i<=n;i++)
if (c[p][i]<cmin[i])
{
cmin[i]=c[p][i];
t[i]=p;
}
}
}
int main()
{int i;
citire();
prim(1);
fprintf(g,"%d\n%d\n",ct,n-1);
for (i=1;i<n;i++)
fprintf(g,"%d %d\n",sol[i][0],sol[i][1]);
return 0;
}