Cod sursa(job #380053)

Utilizator mihaimoldovanMihai Moldovan mihaimoldovan Data 4 ianuarie 2010 18:32:30
Problema Arbore partial de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include<cstdio>
using namespace std;
struct nod{int vf,cost;
		nod *next;};
nod *g[200000];
int n,m,t[200000],d[200000],v[200000];
int radacina (int x)
{
	int tmp,y;
	while(t[x])x=t[x];
	y=x;
	while(t[y])tmp=t[y],t[y]=x,y=tmp;
	return x;
}
void adaugare(int i,int j,int c)
{
    //adauga pe j in lista de vecini ai lui i
    nod *p=new nod;
    p->vf=j;
	p->cost=c;
    p->next=g[i];
    g[i]=p;
}
int main()
{
	int i,j,c,start;
	FILE *f=fopen("apm.in","r");
	fscanf(f,"%d %d",&n,&m);
	for(int i=1;i<=n;i++)
		g[i]=0;
	for(;m;m--)
		{
			fscanf(f,"%d %d %d",&i,&j,&c);
			adaugare(i,j,c);
			adaugare(j,i,c);
			
		}
	start=5;
	t[1]=-1;
	t[start]=0;
	v[start]=1;
	d[start]=1<<30;
	for(nod*p=g[1];p;p=p->next)
		{
			d[p->vf]=p->cost;
			t[p->vf]=1;
		}
	int s=0;
	for(int k=1;k<n;++k)
		{
			int pmin=0;
			for(i=1;i<=n;i++)
				if(d[i]<d[pmin]&&d[i]==0)pmin=i;
			s+=d[pmin];
			v[pmin]=1;
			for(nod*p=g[pmin];p;p=p->next)
				if(d[p->vf]&&v[p->vf]==0)
					d[p->vf]=p->cost,t[p->vf]=pmin;
		}
	FILE *ff=fopen("apm.out","w");
	fprintf(ff,"%d\n",s);
	for(int i=1;i<=n;i++)
		fprintf(ff,"%d %d",i,t[i]);
	return 0;
}