Cod sursa(job #639803)

Utilizator Magnuscont cu nume gresit sau fals Magnus Data 23 noiembrie 2011 23:00:21
Problema Portal3 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>

using namespace std;

typedef long long i64;
inline i64 abs(i64 x){if (x>0) return x;else return -x;}
i64 d[100],u[100],rx[100],ry[100];
struct str{i64 x,y;};
inline str mp(i64 x,i64 y){str aux;aux.x=x;aux.y=y;return aux;}
struct cmp_str{bool operator()(str x,str y){return x.y>y.y;};};
priority_queue <str,vector <str>,cmp_str> q;
vector <str> g[100];

int main()
{
    i64 t,n,m,i,j,c;
    vector <str>::iterator it;
    str aux;
    freopen("portal3.in","r",stdin);
    freopen("portal3.out","w",stdout);
    scanf("%lld",&t);
    for (;t;--t)
    {
        scanf("%lld%lld",&n,&m);
        rx[2]=n;
        ry[2]=m;
        for (i=1;i<=3;++i)
        {
            scanf("%lld%lld%lld%lld%lld",&rx[2*i+1],&ry[2*i+1],&rx[2*i+2],&ry[2*i+2],&c);
            g[2*i+1].push_back(mp(2*i+2,c));
            g[2*i+2].push_back(mp(2*i+1,c));
        }
        for (i=1;i<=8;++i)
            for (j=1;j<=8;++j)
            {
                g[i].push_back(mp(j,abs(rx[i]-rx[j])+abs(ry[i]-ry[j])));
                g[i].push_back(mp(j,abs(rx[i]-rx[j])+abs(ry[i]-ry[j])));
            }
        q.push(mp(1,0));
        while (!q.empty()&&q.top().x!=2)
        {
            aux=q.top();
            q.pop();
            if (u[aux.x])
                continue;
            u[aux.x]=1;
            for (it=g[aux.x].begin();it!=g[aux.x].end();++it)
                if (!u[it->x])
                    q.push(mp(it->x,(it->y)+aux.y));
        }
        printf("%lld\n",q.top().y);
        memset(u,0,sizeof(u));
        while (!q.empty())
            q.pop();
        for (i=1;i<=8;++i)
            g[i].clear();
    }
    return 0;
}