Cod sursa(job #1193732)

Utilizator pavlov.ionPavlov Ion pavlov.ion Data 1 iunie 2014 16:23:50
Problema Sate Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include<stdio.h>
#include<stdlib.h>
  int N,M,X,Y,**C;
  int *viz,*cost;
   struct queue{
		int val;
		queue *next;
	};
queue *p=NULL,*prim=NULL,*ultim=NULL;
void push(int x) {
	queue *nou;
	if(prim==NULL) {
		nou= new queue;
		nou->val=x;
		nou->next=NULL;
		prim=nou;
		ultim=nou;
	}
	else {
		nou= new queue;
		nou->val=x;
		nou->next=NULL;
		ultim->next=nou;
		ultim=nou;
	}
}
int pop() {
	int x;
	x=prim->val;
	prim=prim->next;
	return x;
}
int isEmpty() {
if (prim==NULL)
		return 0;
return 1;
}
void citire() {
	int i,a,b,dist;
	scanf("%d %d %d %d",&N,&M,&X,&Y);
		C=(int**)malloc((N+1)*sizeof(int*));
	for(i=0;i<=N;i++)
		C[i]=(int*)calloc((N+1),sizeof(int));
	for(i=1;i<=M;i++) {
		scanf("%d %d %d",&a,&b,&dist);
		C[a][b]=dist;
		C[b][a]=dist;
	}
	viz=(int*)calloc((N+1),sizeof(int));
	cost=(int*)malloc((N+1)*sizeof(int));
}
void bfs() {
	int i;
	int x;
	for(i=1;i<=N;i++)
			cost[i]=-1;
		cost[X]=0;
		viz[X]=1;
		push(X);
		while(isEmpty()) {
			x=pop();
			for(i=1;i<=N;i++)
				if(viz[i]==0 && C[x][i]>0) {
							push(i);
							if (x<i) {
								cost[i]=cost[x]+C[x][i];
								viz[i]=1;
								}
							if (x>i) {
								cost[i]=cost[x]-C[x][i];
							viz[i]=1;
							}
				}
		}
}
int main () {
freopen("sate.in","r",stdin);
freopen("sate.out","w",stdout);
int i,j;
	citire();
bfs();
printf("%d",cost[Y]);
fclose(stdin);
fclose(stdout);
return 0;
}