Cod sursa(job #2073981)

Utilizator monicalMonica L monical Data 23 noiembrie 2017 22:14:33
Problema Arbore partial de cost minim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
//APM - Algoritmul lui Prim

#include <stdio.h>
#include <algorithm>
#define INF 20000

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];
long long m,n,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)
{
long long i,j,k,mn,p;

for(i=1;i<=n;i++)
  {cmin[i]=c[x][i];
   t[i]=x;
  }
use[x]=1;

for (k=2;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+=mn;
    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,j;
 citire();
 prim(1);
 fprintf(g,"%lld\n%lld\n",ct,n-1);
 for (i=2;i<=n;i++)
    fprintf(g,"%d %d\n",sol[i][0],sol[i][1]);

 return 0;
}