Cod sursa(job #697934)

Utilizator gabriel93Robu Gabriel gabriel93 Data 29 februarie 2012 11:40:36
Problema Arbore partial de cost minim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include<stdio.h>
#include<cstring>
using namespace std;
FILE *f,*g;
int n,m;
char viz[200002];
int d[200002],list[200002];

struct nod 
{
	int v,c;
	nod *adresa;
};
nod *a[200002];

void adaug(int x,int y,int c)
{
	nod *p;
	p=new nod;
	p->v=x;
	p->c=c;
	p->adresa=a[y];
	a[y]=p;
}

void citire()
{
	int i,x,y,c;
	f=fopen("apm.in","rt");
	memset(a,0,sizeof(a));
	fscanf(f,"%d %d",&n,&m);
	for(i=1;i<=m;i++)
	{
		fscanf(f,"%d %d %d",&x,&y,&c);
		adaug(x,y,c);
		adaug(y,x,c);
	}
	fclose(f);
}

void prim()
{
	nod *p;
	int i,j,dmin,s,k;
	memset(d,'10000000',sizeof(d));
	for(p=a[1];p;p=p->adresa)
	{
		list[p->v]=1;
		d[p->v]=p->c;
	}
	viz[1]=1;
	d[1]=0;
	s=0;
	for(k=1;k<=n-1;k++)
	{
		dmin=10000000;
		for(i=1;i<=n;i++)
			if(viz[i]==0 && d[i]<dmin)
			{
				dmin=d[i];
				j=i;
			}
		viz[j]=1;
		s+=d[j];
		for(p=a[j];p;p=p->adresa)
			if(viz[p->v]==0 && d[p->v] > p->c)
			{
				d[p->v]=p->c;
				list[p->v]=j;
			}
	}
	g=fopen("apm.out","wt");
	fprintf(g,"%d\n%d\n",s,n-1);
	for(i=1;i<=n;i++)
		if(list[i]!=0)
			fprintf(g,"%d %d\n",i,list[i]);
	fclose(g);
}

int main()
{
	citire();

	prim();
	
	return 0;
}