Cod sursa(job #638819)

Utilizator CBogdanCiobanu Bogdan CBogdan Data 21 noiembrie 2011 17:51:54
Problema Portal3 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include<cstdio>
#include<iostream>
#include<deque>
#define modulo(x,y) (x>y?x-y:y-x)
#define tip long long 

using namespace std;

tip t,i,j,X[8],Y[8],C[5],M[8][8],D[8],q[8],oo=2000000010;
deque<tip> Q;
void read(),solve();

int main()
{
	read();
	solve();
	
	return 0;
}

void read()
{
	freopen("portal3.in","r",stdin);
	freopen("portal3.out","w",stdout);
	cin>>t;//scanf("%d",&t);
}

void solve()
{
	oo*=1000000000;
	for(;t;t--)
	{
		cin>>X[7]>>Y[7];//scanf("%d%d",&X[7],&Y[7]);
		for(i=1,j=0;i<=3;i++)
		{
			++j;cin>>X[j]>>Y[j];//scanf("%d%d",&X[j],&Y[j]);
			++j;cin>>X[j]>>Y[j];//scanf("%d%d",&X[j],&Y[j]);
			cin>>C[i];//scanf("%d",&C[i]);
		}
		for(i=0;i<8;i++)
		{
			for(j=0;j<8;j++)
			{
				M[i][j]=modulo(X[i],X[j])+modulo(Y[i],Y[j]);
			}
		}
		for(i=1;i<=3;i++)
		{
			if(C[i]<M[2*i-1][2*i])
				M[2*i-1][2*i]=M[2*i][2*i-1]=C[i];
		}
		for(i=1;i<8;i++)D[i]=oo;
		Q.resize(0);
		Q.push_back(0);q[0]=1;
		for(;Q.size();)
		{
			i=Q.front();
			for(j=0;j<8;j++)
			{
				//if(i==j)continue;
				if(D[j]>D[i]+M[i][j])
				{
					if(!q[j])
					{
						Q.push_back(j);q[j]=1;
					}
					D[j]=D[i]+M[i][j];
				}
			}
			q[i]=0;
			Q.pop_front();
		}
		cout<<D[7]<<'\n';//prtipf("%d\n",D[7]);
	}
}