Cod sursa(job #635311)

Utilizator nandoLicker Nandor nando Data 19 noiembrie 2011 10:10:45
Problema Portal3 Scor 100
Compilator cpp Status done
Runda .com 2011 Marime 1.48 kb
#include <cstdio>
#include <cstring>
using namespace std;

FILE* fin = fopen("portal3.in", "r");
FILE* fout = fopen("portal3.out", "w");

typedef long long int64;

#define INF 0x3f3f3f3f

struct point {
	int64 x, y;	
};

inline int64 abs(int64 a) 
{
	return a < 0 ? -a : a;	
}

inline int64 min(int64 a, int64 b) 
{
	return a < b ? a : b;	
}

inline int64 dist(point a, point b) 
{
	return abs(a.x - b.x) + abs(a.y - b.y);
}



void doTest()
{
	int64 n, m;
	fscanf(fin, "%lld %lld\n", &n, &m);
	
	point pt[10];
	int64 c[10][10];
	int64 d[10][10];
	
	memset(pt, 0, sizeof(pt));
	memset(d, 0, sizeof(d));
	memset(c, 0x3f, sizeof(c));
	
	for (int i = 0; i < 3; ++i) {
		int a = (i << 1) + 1, b = (i << 1) + 2;
		fscanf (fin, "%lld %lld %lld %lld %lld\n", &pt[a].x, &pt[a].y, &pt[b].x, &pt[b].y, &c[a][b]);
		c[b][a] = c[a][b];
	}
	
	
	pt[0].x = 0, pt[0].y = 0;
	pt[7].x = n, pt[7].y = m;
	
	for (int i = 0; i < 8; ++i) {
		for (int j = 0; j < 8; ++j) {
			d[i][j] = dist(pt[i], pt[j]);
			d[i][j] = min(d[i][j], c[i][j]);
			
			if (d[i][j] == 0) {
				d[i][j] = INF;	
			}
		}	
	}
	
	for (int k = 0; k < 8; ++k) {
		for (int i = 0; i < 8; ++i) {
			for (int j = 0; j < 8; ++j) {
				d[i][j] = min(d[i][j], d[i][k] + d[k][j]);	
			}	
		}	
	}
	
	fprintf (fout, "%lld\n", d[0][7]);	
}

int main()
{
	int t;
	fscanf (fin, "%d\n", &t);
	
	for (int i = 0; i < t; ++i) {
		doTest();	
	}
	
	fclose(fin);
	fclose(fout);
	return 0;	
}