Cod sursa(job #67733)

Utilizator ZweisteinAdrian VELICU Zweistein Data 25 iunie 2007 13:48:16
Problema Sate Scor 0
Compilator cpp Status done
Runda preONI 2007, Runda Finala, Clasa a 10-a Marime 2.85 kb
#include <stdio.h>
#include <memory.h>
#define MAXN 320 

inline long sadic (long sadick) {
	if (sadick<0) return -sadick; 
			else return sadick;
};

//atentie matrice mare! verifica dimdate!
	long n,m;
	long x,y;
	long di[MAXN][MAXN];

	char areInc[MAXN];
	char areSfars[MAXN];
void pense(long Inc, long Sfars, long Dist) {
		di[Inc][Sfars]=Dist;
		if (!areInc[Inc]) areInc[Inc]=1;
			else {
				for (int j=Inc+1; j<=n; j++) if (di[Inc][j]!=0) if (j!=Sfars) {
//					di[j][Sfars]=di[Inc][Sfars]-di[Inc][j];
//					areSfars[j]=1;
					if ((j<Sfars)&&(di[j][Sfars]==0)) {					
//					fprintf(stderr,"(1) spawned distance [%d %d] decuded from [%d %d] - [%d %d] = %d\n",j,Sfars,Inc,Sfars,Inc,j,sadic(di[Inc][Sfars]-di[Inc][j]));
					pense(j,Sfars,sadic(di[Inc][Sfars]-di[Inc][j]));
					};
				};
			};
		if (!areSfars[Sfars]) areSfars[Sfars]=1;
			else {
				for (int j=Sfars-1; j>0; j--) if (di[j][Sfars]!=0) if (j!=Inc) {
					di[j][Inc]=di[j][Sfars]-di[Inc][Sfars];
					areInc[j]=1;
					if ((j<Inc)&&(di[j][Inc]==0)) {
//					fprintf(stderr,"(2) ! areSfars[%d]! spawned distance [%d %d] decuded from [%d %d] - [%d %d] = %d\n",Sfars,j,Inc,j,Sfars,Inc,Sfars,sadic(di[j][Sfars]-di[Inc][Sfars]));
					pense(j,Inc,sadic(di[j][Sfars]-di[Inc][Sfars]));
					};
				};
			};

};
int main (void) {

	FILE * fi = fopen("sate.in","rt");
	FILE * fo = fopen("sate.out","wt");

//	long n,m;
//	long x,y;
	fscanf(fi,"%ld %ld %ld %ld",&n,&m,&x,&y);
	memset(di,0,sizeof(di));
	memset(areInc,0,sizeof(areInc));
	memset(areSfars,0,sizeof(areSfars));
/*	fprintf(stderr,"known distances: ");
	for (int i=1; i<=n; i++) {
		for (int j=1; j<=n; j++) {
			fprintf(stderr,"%ld\t",di[i][j]);
		};
		fprintf(stderr,"\n");
	}; */

	//atentie distante mari verifica!!! (20 mil)
//	long di[MAXN][MAXN];

//	char areInc[MAXN];
//	char areSfars[MAXN];
	for (int i=1; i<=m; i++) {
		long Inc,Sfars,Dist;
		fscanf(fi,"%ld %ld %ld",&Inc,&Sfars,&Dist);
//		fprintf(stderr,"(*) citit distanta %d %d %d\n",Inc,Sfars,Dist);
		pense(Inc,Sfars,Dist);
/*		di[Inc][Sfars]=Dist;
		if (!areInc[Inc]) areInc[Inc]=1;
			else {
				for (int j=Inc+1; j<=n; j++) if (di[Inc][j]!=0) if (j!=Sfars) {
					di[j][Sfars]=di[Inc][Sfars]-di[Inc][j];
					areSfars[j]=1;
					fprintf(stderr,"(1) spawned distance [%d %d] decuded from [%d %d] - [%d %d]\n",j,Sfars,Inc,Sfars,Inc,j);
				};
			};
		if (!areSfars[Sfars]) areSfars[Sfars]=1;
			else {
				for (int j=Sfars-1; j>0; j--) if (di[j][Sfars]!=0) if (j!=Inc) {
					di[j][Inc]=di[j][Sfars]-di[Inc][Sfars];
					areInc[j]=1;
					fprintf(stderr,"(2) ! areSfars[%d]! spawned distance [%d %d] decuded from [%d %d] - [%d %d]\n",Sfars,j,Inc,j,Sfars,Inc,Sfars);
				};
			};
		*/
	};
	
/*	fprintf(stderr,"known distances: ");
	for (int i=1; i<=n; i++) {
		for (int j=1; j<=n; j++) {
			fprintf(stderr,"%ld\t",di[i][j]);
		};
		fprintf(stderr,"\n");
	};
	fprintf(fo,"%ld",di[x][y]);
	*/
	
	fclose(fi); fclose(fo);
	return 0;
};