Cod sursa(job #636946)

Utilizator laurionLaurentiu Ion laurion Data 20 noiembrie 2011 04:22:19
Problema Portal3 Scor 100
Compilator cpp Status done
Runda .com 2011 Marime 3.49 kb
#include <cstdio>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#include <map>
#include <set>
using namespace std;

const int MAXN = 10;
const int INF = 0x3f3f3f3f;
vector< pair<long long, long long> > G[MAXN];
long long Dmin[MAXN];

//#define DIM 8000
#define DIM 8192
char ax[DIM+16];
long long idx;
inline void cit(long long &x)
{
    x=0;
    while(ax[idx]<'0' || ax[idx]>'9')
                if(++idx==DIM)
                    fread(ax, 1, DIM, stdin), idx=0;
    while(ax[idx]>='0' && ax[idx]<='9')
    {
                x=x*10+ax[idx]-'0';
                if(++idx==DIM)
                    fread(ax,1, DIM, stdin),idx=0;
    }
}

inline long long dist(long long a,long long b, long long c, long long d)
{
//    cerr<<"dist("<<a<<','<<b<<','<<c<<','<<d<<")="<<abs(c-a)+abs(d-b)<<'\n';
    return abs(c-a)+abs(d-b);
}

void dijkstra()
{
	set< pair<long long, long long> > T;
    T.insert( make_pair(0, 0) );
    memset(Dmin, INF, sizeof(Dmin));
    while( T.size() > 0 )
    {
        long long val = (*T.begin()).first, nod = (*T.begin()).second;
        T.erase(*T.begin());
        for (vector< pair<long long, long long> >::iterator it = G[nod].begin(); it != G[nod].end(); ++it)
            if(val + it->second < Dmin[ it->first ]  )
                Dmin[ it->first ] = val + it->second, T.insert(make_pair(Dmin[it->first],it->first));
	}
}
//char s[1000];
//map <char*, long long> cache;

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


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

	    for(int i=1;i<=6;i+=2)
	    {
//	        cerr<<"-----------\n";
	        cit(x[i]);
	        cit(y[i]);
	        cit(x[i+1]);
	        cit(y[i+1]);
	        cit(c[i]);

	    }
//	    sprintf(s,"%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d",n,m,x[1],x[2],x[3],x[4],x[5],x[6],y[1],y[2],y[3],y[4],y[5],y[6],c[1],c[2],c[3]);
//	    map <char*, int> :: const_iterator it = cache.find(s);
//        if(it != cache.end())
//        {
//            cout<<it->second<<'\n';
//            continue;
//        }
        for(int i=1;i<=6;i+=2)
	    {
//	        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)));
        dijkstra();
        cout<<Dmin[7]<<'\n';

//        cache[s] = Dmin[7];
//        for(int i=0;i<8;++i)
//            cerr<<Dmin[i]<<'\n';
        for(int i=0;i<8;++i)
	    {
	        G[i].clear();
	    }
	}
	return 0;

}