Cod sursa(job #671283)

Utilizator noobakafloFlorin eu noobakaflo Data 31 ianuarie 2012 08:47:56
Problema Ubuntzei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include<fstream>
#include<queue>
#include<iostream>
using namespace std;

#define MAX_N 2001
#define INFINIT 99999

int n,m,k[MAX_N],d[MAX_N],t[MAX_N],nr[MAX_N];

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

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

void citeste_graf(void)
{
	fstream f("ubuntzei.in",ios::in);
	int i,nr_k,x,y,c;
	f>>n>>m;
	f>>nr_k;
	for(i=1; i<=nr_k; i++)
		f>>k[i];
	
	for(i=1; i<=m; i++)
	{
		f>>x>>y>>c;
		adauga_muchie(x,y,c);
	}
	f.close();
}

int bellman_ford(int start)
{
	int i,x,nr[MAX_N]={0};
	nod *p;  
	queue <int> C;
	for(i=2; i<=n; i++)
		d[i]=INFINIT;
	C.push(start); 
	while(!C.empty()) 
	{
		x=C.front();
		C.pop();
		
		p=G[x];
		while(p)
		{
			if(d[x]+p->cost<d[p->capat])
			{
				d[p->capat]=d[x]+p->cost;
				t[p->capat]=x;
				C.push(p->capat);
				nr[p->capat]++;
				if(nr[p->capat]==n)
					return 0;
			}
			p=p->next;
		}
	}
	return 1;
}

void construieste_drum(int &cnt,int nod)
{
	if(t[nod])
		construieste_drum(cnt,t[nod]);
	cnt++;
}



int main()
{
	fstream g("ubuntzei.out",ios::out);
	int cnt=0;
	citeste_graf();
	if(bellman_ford(1))
	{
		construieste_drum(cnt,n);
		g<<cnt;
	}
	return 0;
}