Cod sursa(job #635744)

Utilizator swift90Ionut Bogdanescu swift90 Data 19 noiembrie 2011 14:40:47
Problema Portal3 Scor 0
Compilator cpp Status done
Runda .com 2011 Marime 1.5 kb
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
long long X[10],Y[10],C[10],dist[10],inQ[10],N,M;
typedef pair<long long, long long> PLL;
vector<PLL> nr[10];
queue<int> Q;
inline long long modul(long long a){
	if(a<0)
		return -a;
	return a;
}
void BF(){
	Q.push(0);
	inQ[0]=1;
	int x;
	while(!Q.empty()){
		x=Q.front();
		Q.pop();
		inQ[x]=0;
		for(vector<PLL>::iterator it=nr[x].begin();it!=nr[x].end();++it){
			if(dist[(*it).first]>dist[x]+(*it).second){
				dist[(*it).first]=dist[x]+(*it).second;
				if(!inQ[(*it).first]){
					inQ[(*it).first]=1;
					Q.push((*it).first);
				}
			}
		}
	}
}
void solve(){
	int i,j;
	scanf("%lld%lld",&N,&M);
	for(i=1;i<=6;i+=2){
		scanf("%lld%lld%lld%lld%lld",&X[i],&Y[i],&X[i+1],&Y[i+1],&C[i]);
		nr[i].push_back(PLL(i+1,C[i]));
		nr[i+1].push_back(PLL(i,C[i]));
	}
	X[7]=N;
	Y[7]=M;
	for(i=1;i<=7;++i)
		nr[0].push_back(PLL(i,X[i]+Y[i]));
	for(i=0;i<7;++i)
		nr[i].push_back(PLL(7,N-X[i]+M-Y[i]));
	for(i=1;i<=6;++i){
		for(j=1;j<=6;++j){
			if((i==1 || i==3 || i==5) && j==i+1)
				continue;
			nr[i].push_back( PLL(j,modul(X[i]-X[j]) + modul(Y[i]-Y[j])) );
			nr[j].push_back( PLL(i,modul(X[i]-X[j]) + modul(Y[i]-Y[j])) );
		}
	}
	for(i=1;i<8;++i)
		dist[i]=N*M+1;
	BF();
	printf("%lld\n",dist[7]);
}
int main(){
	freopen("portal3.in","r",stdin);
	freopen("portal3.out","w",stdout);
	int T;
	scanf("%d",&T);
	for(;T;--T)
		solve();
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}