Cod sursa(job #586435)

Utilizator maritimCristian Lambru maritim Data 1 mai 2011 11:05:21
Problema Algoritmul Bellman-Ford Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
//Lambru Andrei Cristian - Arhiva Educationala
//Problema Bellman Ford
#include<stdio.h>
#include<malloc.h>

typedef struct _nod
{
	int info;
	int cost;
	struct _nod *adr;
} nod;

typedef struct
{
	struct _nod *cap;
} list;

list A[50001];
long long D[50001];
int viz[50001];
int N;
int M;

void add(int a,int b,int c)
{
	nod *nou = (nod*)malloc(sizeof(nod));
	nou->info = b;
	nou->cost = c;
	nou->adr = A[a].cap;
	A[a].cap = nou;
}

void citire(void)
{
	int a;
	int b;
	int c;
	FILE *f = fopen("bellmanford.in","r");
	
	fscanf(f,"%d %d",&N,&M);
	for(int i=1;i<=M;i++)
	{
		fscanf(f,"%d %d %d",&a,&b,&c);
		add(a,b,c);
	}
	
	fclose(f);
}

void add2(nod*& Cf,int a)
{
	nod *nou = (nod*)malloc(sizeof(nod));
	nou->info = a;
	nou->adr = NULL;
	Cf->adr = nou;
	Cf = nou;
}

int parc(void)
{
	nod *Ci = (nod*)malloc(sizeof(nod));
	Ci->info = 1;
	Ci->adr = NULL;
	nod *Cf = Ci;
	while(Ci)
	{
		nod *q = A[Ci->info].cap;
		while(q)
		{
			if(!D[q->info] || D[q->info] > D[Ci->info] + q->cost)
			{
				if(viz[q->info] > N)
					return 0;
				viz[q->info] ++;
				D[q->info] = D[Ci->info] + q->cost;
				add2(Cf,q->info);
			}
			q = q->adr;
		}
		Ci = Ci->adr;
	}
	return 1;
}

int main()
{
	FILE *g = fopen("bellmanford.out","w");

	citire();
	if(!parc())
		fprintf(g,"Ciclu negativ!");
	else
		for(int i=2;i<=N;i++)
			fprintf(g,"%d ",D[i]);
	
	fclose(g);
	return 0;
}