Cod sursa(job #636941)

Utilizator laurionLaurentiu Ion laurion Data 20 noiembrie 2011 03:39:56
Problema Portal3 Scor 0
Compilator cpp Status done
Runda .com 2011 Marime 2.93 kb
#include <cstdio>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#include <set>
using namespace std;

const int MAXN = 10;
const int INF = 0x3f3f3f3f;
vector< pair<int, int> > G[MAXN];
int Dmin[MAXN];
//#define DIM 8000
#define DIM 8192
char ax[DIM+16];
int idx;
inline void cit(int &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 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 dijkstra()
{
	set< pair<int, int> > T;
    T.insert( make_pair(0, 0) );
    memset(Dmin, INF, sizeof(Dmin));
    while( T.size() > 0 )
    {
        int val = (*T.begin()).first, nod = (*T.begin()).second;
        T.erase(*T.begin());
        for (vector< pair<int, int> >::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));
	}
}

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--)
	{
	    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]);
//	        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';
//        for(int i=0;i<8;++i)
//            cerr<<Dmin[i]<<'\n';
        for(int i=0;i<10;++i)
	    {
	        G[i].clear();
	    }
	}
	return 0;

}