Cod sursa(job #637781)
#include<fstream>
#include<iostream>
using namespace std;
typedef struct { long x,y; } punct;
punct P[10];
long C[5],t;
long Cost[10];
long n,m,minim,i,minim_el,el,x,l;
long V[10];
inline long abs ( long x)
{
if ( 0<x)
return x;
return -x;
}
inline long min ( long a, long b)
{
if ( a<b )
return a;
return b;
}
int main()
{
ifstream in("portal3.in");
ofstream out("portal3.out");
in>>t;
for ( ; t; --t)
{
for ( i=1; i<=7; ++i)
V[i]=0;
in>>n>>m;
for ( i=1; i<=7; ++i)
Cost[i]=n+m+5;
for ( i=1; i<=3; ++i)
in>>P[2*i-1].x>>P[2*i-1].y>>P[2*i].x>>P[2*i].y>>C[i];
P[7].x=n;
P[7].y=m;
V[0]=1;
minim=n+m+5;
el=0;
while (V[7]==0)
{
//cout<<el<<" "<<Cost[el]<<"\n";
for ( i=1; i<=7; ++i)
{
if ( V[i]==0 )
{
if ( (el+1)/2==(i+1)/2 )
{
// avem pereche
x=Cost[el];
//cout<<"@@@@@@@@ "<<x<<" "<<Cost[el]<<" ";
x+=abs( P[el].x-P[i].x );
//cout<<"!!"<<x<<" ";
x+=abs(P[el].y-P[i].y);
//cout<<"!!"<<x<<" ";
//cout<<"!!"<<x<<" ";
x=min(C[(i+1)/2]+Cost[el],x);
//cout<<"!!!"<<x<<"\n";
if ( Cost[i]>x)
Cost[i]=x;
}
else
if ( Cost[i]>Cost[el]+abs( P[el].x-P[i].x )+ abs(P[el].y-P[i].y) )
Cost[i]=Cost[el]+abs( P[el].x-P[i].x )+ abs(P[el].y-P[i].y);
}
}
/* for ( i=1; i<=7; ++i)
cout<<Cost[i]<<" ";
cout<<"\n"; */
minim=n+m+5;
for ( l=1; l<=7; ++l)
if ( V[l]==0 && Cost[l]<minim)
{
minim=Cost[l];
minim_el=l;
}
el=minim_el;
V[el]=1;
}
out<<Cost[7]<<"\n";
}
return 0;
}