Cod sursa(job #560223)

Utilizator lakat_tLakatos Tamas lakat_t Data 18 martie 2011 13:12:11
Problema Ciclu hamiltonian de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include<iostream>
#include<fstream>
#include<algorithm>

using namespace std;

ifstream fin("hamilton.in");
ofstream fout("hamilton.out");

struct el
{
	int a,b;
	long ert;
} elvek[307];

struct node
{
	int csucs;
	node *kov;
};

struct elem
{
	int halmaz;
	node *lista;
} v[19];

long n,m,a,b,c;

bool comp(el p,el q)
{
	return p.ert<q.ert;
};

int tovabb()
{
	int i=1;
	while(i<=n-1)
	{
		if(v[i-1].halmaz!=v[i-1].halmaz)
			return 0;
		i++;
	}
	return -1;	
}

int atrak(int a,int b)
{
	v[b].halmaz=v[a].halmaz;
	node *p=v[b].lista;
	while(p!=NULL)
	{
		v[p->csucs].halmaz=v[a].halmaz;
		node *q=p;
		q->kov=v[a].lista;
		v[a].lista=q;
		p=p->kov;
	}
	p=v[b].lista;
	while(p!=NULL)
	{
		v[p->csucs].lista=v[a].lista;
		p=p->kov;
	}
	return 0;
}

int main()
{
	fin>>n>>m;
	for(int i=0;i<=n-1;i++)
	{
		v[i].halmaz=i;
		v[i].lista=NULL;
	}
	for(int i=1;i<=m;i++)
	{
		fin>>elvek[i].a>>elvek[i].b>>elvek[i].ert;
	}
	sort(elvek+1,elvek+m+1,comp);
/*	for(int i=1;i<=m;i++)
	{
		cout<<elvek[i].a<<" "<<elvek[i].b<<" "<<elvek[i].ert<<"\n";
	}*/
	int t=tovabb(),i=1,sum=0;
	while (t==1&&i<=m)
	{
		if(v[elvek[i].a].halmaz!=v[elvek[i].b].halmaz)
		{
			atrak(a,b);
			sum=sum+elvek[i].ert;
		}
		t=tovabb();
		i++;
	}
	if (t!=1)
		fout<<sum;
	else 
		fout<<"Nu exista solutie";
	return 0;
}