Cod sursa(job #638574)

Utilizator ELHoriaHoria Cretescu ELHoria Data 20 noiembrie 2011 23:02:40
Problema Portal3 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <fstream>
#include <vector>
#include <queue>
#define ll long long

using namespace std;

ifstream fin("portal3.in");
ofstream fout("portal3.out");

const ll INF = 1LL<<62;
vector<pair<int,ll> > G[10];
ll T , x[16] , y[16] , c[4] , C[10];

inline ll abs(ll x)
{
	return x > 0 ? x : -x;
}

ll dist(const int x1,const int y1,const int x2,const int y2)
{
	return abs(x2-x1) + abs(y2-y1);
}

void bfs()
{
	int v;
	queue<int> Q;
	Q.push(0);
	C[0] = 0;
	while(!Q.empty())
	{
		v = Q.front() , Q.pop();
		for(vector<pair<int,ll> >::iterator w=G[v].begin();w!=G[v].end();++w)
			if(C[(*w).first] > C[v] + (*w).second)
				C[(*w).first] = C[v] + (*w).second , Q.push((*w).first);
	}
	fout<<C[7]<<'\n';
	for(int i=0;i<=7;++i)
		G[i].clear() , C[i] = INF;
}

int main()
{
	for(int i=1;i<=9;++i) C[i] = INF;
	fin>>T;
	for(;T;T--)
	{
		fin>>x[7]>>y[7];
		fin>>x[1]>>y[1]>>x[2]>>y[2]>>c[1];
		G[1].push_back(make_pair(2,c[1]));
		G[2].push_back(make_pair(1,c[1]));
		fin>>x[3]>>y[3]>>x[4]>>y[4]>>c[2];
		G[3].push_back(make_pair(4,c[2]));
		G[4].push_back(make_pair(3,c[2]));
		fin>>x[5]>>y[5]>>x[6]>>y[6]>>c[3];
		G[5].push_back(make_pair(6,c[3]));
		G[6].push_back(make_pair(5,c[3]));
	
		for(int i=1;i<=7;++i)
			G[0].push_back(make_pair(i,x[i] + y[i])) , G[i].push_back(make_pair(0,x[i] + y[i]));
		for(int i=1;i<=7;++i)
			for(int j=1;j<=7;++j)
			if(i!=j)
				G[i].push_back(make_pair(j,dist(x[i],y[i],x[j],y[j])));
		bfs();
	}
	return 0;
}