Cod sursa(job #364769)

Utilizator titusuTitus C titusu Data 16 noiembrie 2009 22:03:23
Problema Sate Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <cstdio>
#include <cstdlib>
struct muchie{
	int capat; int cost;
};

muchie *a[30001];
int n,x,y, grad[30001];
int v[30001], cost[30001];

int  bfs(int start, int finish){
	int coada[30001],st=1,dr=1;
	coada[1] = start;
	v[start]=1;
	cost[start]=0;
	while(st <= dr){
		int k = coada[st++];
		for(int i = 1; i<=grad[k] ; i++)
			if( ! v[a[k][i].capat] )
			{
				coada[++dr] = a[k][i].capat;
				v[coada[dr]] =1;
				if(k<a[k][i].capat)
					cost[a[k][i].capat] = cost[k] + a[k][i].cost;
				else
					cost[a[k][i].capat] = cost[k] - a[k][i].cost;
				if(coada[dr] == finish)
					return cost[finish];
			}
	}
	for(int i =1 ; i<= dr ; i++)
		printf("%d ",coada[i]);
	printf("\n");
	return -1;
}

void read(){
	FILE *f = fopen("sate.in","r");
	int m;
	fscanf(f,"%d%d%d%d",&n,&m,&x,&y);
	for(int i=1;i<=n;i++){
		a[i] = (muchie *) malloc(1*sizeof(muchie));
		grad[i]=0;
	}
	for( ; m; m--){
		int i,j,c;
		fscanf(f,"%d%d%d",&i,&j,&c);
		a[i] = (muchie *)realloc(a[i], sizeof(muchie)*(grad[i]+2));
		grad[i]++;
		a[i][grad[i]].capat = j;
		a[i][grad[i]].cost = c;
		grad[j]++;
		a[j] = (muchie *) realloc(a[j], sizeof(muchie) * (grad[j]+2));
		a[j][grad[j]].capat=i;
		a[j][grad[j]].cost=c;
	}

}

void afis(){
	for(int i=1;i<=n;i++)
	{
		printf ("%d : ",i);
		for(int j = 1 ; j<=grad[i] ; j++)
			printf("(%d, %d, %d)\n",i, a[i][j].capat, a[i][j].cost);
		printf("\n");
	}
}

int rez(int x , int y){
	if(x==y)
		return 0;
	if(x>y)
	{
		int aux = x; x= y; y = aux;
	}
	return bfs(x,y);
}

int main(){	
	read();
//	afis();
	FILE *f = fopen("sate.out","w");
	fprintf(f,"%d\n",rez(x,y));
	fclose(f);
	return 0;
}