Pagini recente » Cod sursa (job #1879558) | Cod sursa (job #670038)
Cod sursa(job #670038)
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
int n,m,minim=0;
pair<int,int> x,y,z;
long long dp[10],ad[10][10];
vector<pair<int, int > > v;
vector<int> kuri;
queue<int> d;
int dist(pair<int,int> x,pair<int,int> y)
{
return (abs(x.first-y.first)+abs(x.second-y.second));
}
void citire()
{
scanf("%d %d",&n,&m);
v.push_back( make_pair(0,0) );
kuri.reserve(5);
v.reserve(10);
for(int i=0;i<3;i++)
{
int k;
scanf("%d %d %d %d %d",&x.first,&x.second,&y.first,&y.second,&k);
v.push_back(x);
v.push_back(y);
kuri.push_back(k);
}
v.push_back(make_pair(n,m));
return;
}
void calc()
{
for(int i=0;i<=7;i++)
for(int j=0;j<=7;j++)
{
if(i!=j)
{
ad[i][j]=dist(v[i],v[j]);
if(abs(i-j)==1 && min(i,j)%2!=0)
{
ad[i][j]=min(ad[i][j],(kuri[min(i,j)/2]*1LL));
}
}
}
for(int i=1;i<=8;i++) dp[i]=n+m;
dp[0]=0;
d.push(0);
while(d.size())
{
int x=d.front();
d.pop();
for(int i=0;i<=7;i++)
if(x!=i && dp[x]+ad[x][i]<dp[i])
{
dp[i]=dp[x]+ad[x][i];
d.push(i);
}
}
return;
}
int main()
{
freopen("portal3.in","r", stdin);
freopen("portal3.out","w", stdout);
int t;
scanf("%d",&t);
for(int i=1;i<=t;i++)
{
citire();
calc();
printf("%d\n",dp[7]);
v.clear();
kuri.clear();
}
/*for(int i=1;i<=n;i++)
{
cout<<endl;
for(int j=1;j<=m;j++)
cout<<h[i][j]<<" ";
}*/
return 0;
}