Cod sursa(job #638189)

Utilizator andunhillMacarescu Sebastian andunhill Data 20 noiembrie 2011 19:26:05
Problema Portal3 Scor 0
Compilator cpp Status done
Runda .com 2011 Marime 1.98 kb
#include<fstream>
#include<vector>
#include<iostream>
#include<queue>
using namespace std;

#define INF 2147483647
#define pii pair<int,int>
#define mp make_pair
#define X first
#define Y second

ifstream f("portal3.in");
ofstream g("portal3.out");

struct nod
{	int to;
	int cost;
	nod(int a, int ct)
	{	to = a; cost = ct;
	}
};



int T, N, M;
vector<nod>graf[10];
queue<int>q;
pii nods[10];
int sol[10];

int abs(int a)
{	if(a < 0) return -a;
	return a;
}

int dist(int a, int b)
{	return abs(nods[a].X - nods[b].X) + abs(nods[a].Y - nods[b].Y);
}

void bellman()
{	int i, j;
	int v, c;
	q.push(1);
	sol[1] = 0;
	for(i = 2; i < 10; i++) sol[i] = INF;
	
	while(!q.empty())
	{	i = q.front(); q.pop();
	
		for(j = 0; j < graf[i].size(); j++)
		{	v = graf[i][j].to; c = graf[i][j].cost;
			if(sol[v] > sol[i] + c)
				sol[v] = sol[i] + c, q.push(v);
		}
	}
}

int main()
{	int i, j, x, y, x2, y2, c;

	nods[1] = mp(0, 0);
	
	f>>T;
	for(; T; T--)
	{	f>>N>>M;
		
		f>>x>>y>>x2>>y2>>c;
		nods[2] = mp(x, y);
		nods[3] = mp(x2, y2);
		
		graf[2].push_back(nod(3 , c));
		graf[3].push_back(nod(2 , c));
		
		f>>x>>y>>x2>>y2>>c;
		nods[4] = mp(x, y);
		nods[5] = mp(x2, y2);
		
		graf[4].push_back(nod(5 , c));
		graf[5].push_back(nod(4 , c));
		
		f>>x>>y>>x2>>y2>>c;
		nods[6] = mp(x, y);
		nods[7] = mp(x2, y2);
		
		graf[6].push_back(nod(7 , c));
		graf[7].push_back(nod(6 , c));
		
		nods[8] = mp(N, M);
		
		for(i = 1; i < 8; i++)
			for(j = (i == 2 || i == 4 || i == 6)?i + 2 : i + 1; j <= 8; j++)
			{	graf[i].push_back(nod(j, dist(i, j)));
				graf[j].push_back(nod(i, dist(i, j)));
			}
			
		/*for(i = 1; i <= 8; i++)
		{	cout<<"NOD: "<<i<<'\n';
			for(j = 0; j < graf[i].size(); j++) cout<<graf[i][j].to<<" "<<graf[i][j].cost<<'\n';
			cout<<"//////////////////////////"<<'\n';
		}*/
		
		bellman();
		g<<sol[8]<<'\n';
		for(i = 1; i <= 8; i++) graf[i].clear();
	}
	f.close();
	g.close();
	return 0;
}