Cod sursa(job #672890)

Utilizator noobakafloFlorin eu noobakaflo Data 3 februarie 2012 13:05:17
Problema Ubuntzei Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include<stdio.h>
#include<queue>
using namespace std;

#define INF 999999
#define MAX_N 2001

int n,m,prieteni[MAX_N],tata[MAX_N];

struct nod
{
	int capat,cost;
	nod *next;
}*G[MAX_N];


void adauga_muchie(int x,int y,int c)
{
	nod *p;          p=new nod;
	p->capat=y;      p->cost=c;
    p->next=G[x];    G[x]=p;
}	

void citeste_graf(void)
{
	freopen("ubuntzei.in","r",stdin);
	int i,x,y,c,nr_p;
	scanf("%d %d",&n,&m);
	scanf("%d ",&nr_p);
	for(i=1; i<=nr_p; i++)
		scanf("%d ",&prieteni[i]);
	for(i=1; i<=m; i++)
	{
		scanf("%d %d %d\n",&x,&y,&c);
		adauga_muchie(x,y,c);
	}
}

void bellman_ford(int start)
{
	int i,x,d[MAX_N]={0};
	queue <int> c;
	for(i=2; i<=n; i++)
		d[i]=INF;
	
	c.push(start);
	while(!c.empty())
	{
		x=c.front();
		c.pop();
		for(nod *p=G[x]; p!=NULL; p=p->next)
			if(d[p->capat]>d[x]+p->cost)
			{
				d[p->capat]=d[x]+p->cost;
				tata[p->capat]=x;
				c.push(p->capat);
			}
	}
	
}

void formeaza_drum(int traseu[MAX_N],int &k,int i)
{
	if(tata[i])
		formeaza_drum(traseu,k,tata[i]);
	traseu[k++]=i;
}

void scrie_solutie(int traseu[MAX_N],int k)
{
	int i,lmin=0;
	nod *p;
	for(i=0; i<k-1; i++)
		for(p=G[traseu[i]]; p!=NULL; p=p->next)
			if(p->capat==traseu[i+1])
			{
				lmin+=p->cost;
				break;
			}
	printf("%d ",lmin);
}


int main()
{
	freopen("ubuntzei.in","r",stdin);
	freopen("ubuntzei.out","w",stdout);
	
	int traseu[MAX_N],k=0;
	citeste_graf();
	bellman_ford(1);
	formeaza_drum(traseu,k,n);
	scrie_solutie(traseu,k);
	return 0;
}