Cod sursa(job #571432)

Utilizator maritimCristian Lambru maritim Data 4 aprilie 2011 14:17:39
Problema Sate Scor 15
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>

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

typedef struct 
{
	struct _nod *cap;
} list;

list A[30001];
int N;
int M;
int X;
int Y;
int MAX = 0;
int viz[30001];

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("sate.in","r");
	
	fscanf(f,"%d %d %d %d",&N,&M,&X,&Y);
	for(int i=1;i<=N;i++)
	{
		fscanf(f,"%d %d %d",&a,&b,&c);
		add(a,b,c);
		add(b,a,c);
	}
	
	fclose(f);
}

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

void parcurgere(void)
{
	nod *Ci = (nod*)malloc(sizeof(nod));
	Ci->info = X;
	Ci->cost = 0;
	nod *Cf = Ci;
	int gata = 1;
	while(Ci && gata)
	{
		if(Ci->info == Y)
		{
			MAX = Ci->cost;
			gata = 0;
		}
		nod *q = A[Ci->info].cap;
		while(q)
		{
			if(Ci->info-q->info && !viz[q->info])
			{
			if(q->info<Ci->info)
				add2(Cf,q->info,Ci->cost-q->cost);
			else
				add2(Cf,q->info,Ci->cost+q->cost);
			}
			q = q->adr;
		}
		q = Ci;
		Ci = Ci->adr;
		free(q);
	}
}

int main()
{
	FILE *f = fopen("sate.out","w"); 
	
	citire();
	parcurgere();
	fprintf(f,"%d",abs(MAX));
	
	fclose(f);
	return 0;
}