Cod sursa(job #700722)

Utilizator amerigohi lili amerigo Data 1 martie 2012 11:42:24
Problema Arbore partial de cost minim Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include <fstream>
//#include <iostream.h>
//#include <conio.h>
using namespace std;

ifstream f("apm.in");
ofstream g("apm.out");

int x,y,n,m,i,c,minn,nb=0,nb2=0,nb3=0;

struct tlink {int nod,cost; tlink *next,*prev;};
struct tlist {tlink *first,*last;int nb;};
void addlast(tlist &list,int nod,int val=0)
{
	tlink *l=new tlink;
	l->nod=nod;
	l->cost=val;
	if(list.first==NULL) {list.first=l;list.last=l;}
	list.last->next=l;
	l->prev=list.last;
	list.last=l;
	l->next=NULL;
	list.nb++;
}
struct tnod {int chk,val; tlist list;} a[200001];
void link(int x, int y,int val=0)
{
	addlast(a[x].list,y,val);
	addlast(a[y].list,x,val);
}

int main()
{
	f>>n>>m;
	for(i=1;i<=n;i++)
	{
		a[i].chk=0;
		a[i].val=0;
		a[i].list.first=NULL;
	}
	for(i=1;i<=m;i++)
	{
		f>>x>>y>>c;
		link(x,y,c);
	}
	int k=1;
	int miny=k,minx;
	tlist noduri;
	tlist muchii;
	noduri.first=NULL;
	noduri.nb=0;
	muchii.first=NULL;
	a[k].chk=1;
	addlast(noduri,k);
	while(miny!=0)
	{
		tlink *t1=noduri.first;
		minn=1001;
		miny=0;
		while(t1!=NULL)
		{
			nb3=0;
			tlink *t2=a[t1->nod].list.first;
			while(t2!=NULL)
			{	
				if(a[t2->nod].chk==0 && t2->cost<minn)
				{
					minx=t1->nod;
					miny=t2->nod;
					minn=t2->cost;
				}
				if(a[t2->nod].chk==1) nb3++;
				t2=t2->next;
			}
			if(nb3==a[t1->nod].list.nb)
				t1->prev=t1->next;
			t1=t1->next;
		}
		if(miny!=0)
		{
			addlast(noduri,miny);
			addlast(muchii,minx,miny);
			a[miny].chk=1;
			nb+=minn;
			nb2++;
		}
	}
	g<<nb<<endl<<nb2<<endl;
	tlink *t1=muchii.first;
	while(t1!=NULL)
	{
		g<<t1->nod<<" "<<t1->cost<<endl;
		t1=t1->next;
	}
	g.close();
	f.close();
	return 0;
}