Cod sursa(job #670037)

Utilizator alexalghisiAlghisi Alessandro Paolo alexalghisi Data 28 ianuarie 2012 11:01:06
Problema Portal3 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#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()
{
	minim=1<<30;
	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;
}