Cod sursa(job #1693048)

Utilizator Gabriel_95Pasparan Gabriel Gabriel_95 Data 22 aprilie 2016 11:42:21
Problema Arbore partial de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <iostream>
#include <fstream>
#define INF 200500
using namespace std;

long c[INF][INF],T[INF],Q[INF],n;
ifstream f("apm.in");
ofstream g("apm.out");

void citire_graf()
{
	int m,x,y,z;

	f>>n;
	f>>m;

	for(int i=1 ; i <= n ; i++)
		for(int j=1 ; j <= n ; j++)
			c[i][j]=INF;

	for(int i=1 ; i <= n ; i++)
		c[i][i]=0;

	for(int i=1 ; i <= m ; i++)
	{
        f>>x>>y>>z;
		c[x][y]=z;
		c[y][x]=z;
	}
}
void creare_apm()
{
    int ar[n*2][3];
    int V[INF],minim,w,cost=0,muchii=0;

	for(int i=2 ; i <= n ; i++)
        V[i]=i;  //varfurile neincluse in arbore
	V[1]=0;

	for(int i=2 ; i <= n ; i++)
	{
	    T[i]=1;
        Q[i]=c[1][i];
	}

	while(1)
	{
	    minim=INF;  //determinam muchia de cost minim

		for(int i=2 ; i <= n ; i++)
			if(V[i] && Q[i]<minim)
			{
			    minim=Q[i];
                w=i;
			}

		if(minim == INF)
            break;

        V[w]=0;  //varful w a fost inclus in arbore
        ar[muchii][1]=T[w];
        ar[muchii][2]=w;//muchia adaugata
        muchii++;
        cost=cost + c[T[w]][w];  //actualizam costul arborelui

        for(int j=2 ; j <= n ; j++)
            if(V[j] && Q[j] > c[w][j])
            {
                T[j]=w;
                Q[j]=c[w][j];
            }
	}

	g<<cost<<endl;
    g<<muchii<<endl;

    for(int i=0 ; i < muchii ; i++)
        g<<ar[i][1]<<" "<<ar[i][2]<<endl;
}
int main()
{
    citire_graf();
	creare_apm();
	return 0;
}