Cod sursa(job #635779)

Utilizator swift90Ionut Bogdanescu swift90 Data 19 noiembrie 2011 14:51:57
Problema Portal3 Scor 100
Compilator cpp Status done
Runda .com 2011 Marime 1.66 kb
#include<cstdio>
#include<fstream>
#include<vector>
using namespace std;
ifstream f("portal3.in");
ofstream g("portal3.out");
long long X[10],Y[10],C[10],dist[10],inQ[10],N,M;
typedef pair<int, long long> PLL;
vector<PLL> nr[10];
int Q[1000];
inline long long modul(long long a){
	if(a<0)
		return -a;
	return a;
}
void BF(){
	Q[0]=0;
	inQ[0]=1;
	int x,i,dim,p=0,u=0;
	while(p<=u){
		x=Q[p];
		++p;
		inQ[x]=0;
		dim=(int)nr[x].size();
		for(i=0;i<dim;++i){
			if(dist[nr[x][i].first]>dist[x]+nr[x][i].second){
				dist[nr[x][i].first]=dist[x]+nr[x][i].second;
				if(!inQ[nr[x][i].first]){
					inQ[nr[x][i].first]=1;
					Q[++u]=nr[x][i].first;
				}
			}
		}
	}
}
void solve(){
	int i,j;
	//scanf("%lld%lld",&N,&M);
	f>>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]);
		f>>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();
	for(i=0;i<8;++i)
		nr[i].clear();
	//printf("%lld\n",dist[7]);
	g<<dist[7]<<'\n';
}
int main(){
	//freopen("portal3.in","r",stdin);
	//freopen("portal3.out","w",stdout);
	int T;
	//scanf("%d",&T);
	f>>T;
	for(;T;--T)
		solve();
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}