Cod sursa(job #636935)

Utilizator laurionLaurentiu Ion laurion Data 20 noiembrie 2011 02:44:45
Problema Portal3 Scor 0
Compilator cpp Status done
Runda .com 2011 Marime 2.53 kb
#include <cstdio>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;

const int MAXN = 10;
const int INF = 0x3f3f3f3f;

vector< pair<int, int> > G[MAXN];
int Dmin[MAXN];
inline int dist(int a,int b, int c, int d)
{
//    cerr<<"dist("<<a<<','<<b<<','<<c<<','<<d<<")="<<abs(c-a)+abs(d-b)<<'\n';
    return abs(c-a)+abs(d-b);
}
void bellman_ford() {
	bool InQueue[MAXN];
	queue<int> Q;

	memset(Dmin, INF, sizeof(Dmin));
	memset(InQueue, false, sizeof(InQueue));

	Dmin[0] = 0;
	Q.push(0);
	InQueue[0] = true;

	while (!Q.empty()) {
		int nod = Q.front();
		Q.pop();
		InQueue[nod] = false;

		for (vector< pair<int, int> >::iterator it = G[nod].begin(); it != G[nod].end(); ++it)
			if (Dmin[nod] + it->second < Dmin[it->first]) {
				Dmin[it->first] = Dmin[nod] + it->second;
				if (!InQueue[it->first]) {
					Q.push(it->first);
					InQueue[it->first] = true;
				}
			}
	}
}

int main()
{
	freopen("portal3.in","rt",stdin);
	freopen("portal3.out","wt",stdout);

	int n,m,x[10],y[10],c[10],T;
	cin>>T;
	while(T--)
	{
	    cin>>n>>m;

	    for(int i=1;i<=6;i+=2)
	    {
//	        cerr<<"-----------\n";
	        cin>>x[i]>>y[i]>>x[i+1]>>y[i+1]>>c[i];
//	        cerr<<"0,"<<i<<"\n";
	        G[0].push_back(make_pair(i,dist(0,0,x[i],y[i])));
//	        cerr<<"0,"<<i+1<<"\n";
	        G[0].push_back(make_pair(i+1,dist(0,0,x[i+1],y[i+1])));
//            cerr<<i<<","<<i+1<<"\n";
	        G[i].push_back(make_pair(i+1,c[i]));
//	        cerr<<i+1<<","<<i<<"\n";
	        G[i+1].push_back(make_pair(i,c[i]));
//            cerr<<i<<","<<7<<"\n";
	        G[i].push_back(make_pair(7,dist(x[i],y[i],n,m)));
//	        cerr<<i+1<<","<<7<<"\n";
	        G[i+1].push_back(make_pair(7,dist(x[i+1],y[i+1],n,m)));
	    }
//        cerr<<"-----------\n";
	    for(int i=1;i<=6;i+=2)
	    {
	        for(int j=i+2;j<=6;j++)
	        {
//	            cerr<<i<<","<<j<<"\n";
	            G[i].push_back(make_pair(j,dist(x[i],y[i],x[j],y[j])));
	            G[j].push_back(make_pair(i,dist(x[i],y[i],x[j],y[j])));
	            G[i+1].push_back(make_pair(j,dist(x[i+1],y[i+1],x[j],y[j])));
	            G[j].push_back(make_pair(i+1,dist(x[i+1],y[i+1],x[j],y[j])));
	        }
	    }
	    G[0].push_back(make_pair(7,dist(0,0,n,m)));
        bellman_ford();
        cout<<Dmin[7]<<'\n';
//        for(int i=0;i<8;++i)
//            cerr<<Dmin[i]<<'\n';
        for(int i=0;i<10;++i)
	    {
	        G[i].clear();
	    }
	}
	return 0;

}