Cod sursa(job #670198)

Utilizator noobakafloFlorin eu noobakaflo Data 28 ianuarie 2012 17:14:26
Problema Ubuntzei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include<fstream>
#include<queue>
using namespace std;

#define MAX_N 50001
#define INFINIT 100000

fstream f("ubuntzei.in",ios::in);
fstream g("ubuntzei.out",ios::out);

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

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

void add_edge(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 read_from_file(void)
{
	int i,x,y,c;
	f>>n>>m>>nr_pr;
	for(i=1; i<=nr_pr; i++)
		f>>k[i];
	for(i=1; i<=m; i++)
	{
		f>>x>>y>>c;
		add_edge(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])
			{
				t[p->capat]=x;
				d[p->capat]=d[x]+p->cost;
				C.push(p->capat);
				nr[p->capat]++;
				if(nr[p->capat]==n)
					return 0;
			}
			p=p->next;
		}
	}
	return 1;
}

void drum_minim(int nod)
{
	if(t[nod])
		drum_minim(t[nod]);
	g<<nod<<" ";
}
	
void write_to_file(void)
{
	if(bellman_ford(1))
		drum_minim(n);
	else
		g<<"Eroare!Exista ciclu negativ!\n";
	g.close();
}

int main()
{
	read_from_file();
	write_to_file();
	
	return 0;
}