Cod sursa(job #638192)

Utilizator proflaurianPanaete Adrian proflaurian Data 20 noiembrie 2011 19:26:32
Problema Portal3 Scor 0
Compilator cpp Status done
Runda .com 2011 Marime 1.42 kb
#include<cstdio>
#include<iostream>
#include<deque>
#include<algorithm>
#define tip long long
using namespace std;
tip t,x[10],y[10],q[10],i,j,c[5],T[10][10],D[10],oo=2000000010;
deque<tip> Q;
int main()
{
    freopen("portal3.in","r",stdin);
    freopen("portal3.out","w",stdout);
    oo*=1000000000;cin>>t;//scanf("%d",&t);
    for(;t;t--)
    {
        cin>>x[7]>>y[7];//scanf("%d%d",&x[7],&y[7]);
        for(j=0,i=1;i<=3;i++)
        {
            j++;cin>>x[j]>>y[j];//scanf("%d%d",&x[j],&y[j]);
            j++;cin>>x[j]>>y[j];//scanf("%d%d",&x[j],&y[j]);
            cin>>c[i];//scanf("%d",&c[i]);
        }
        for(i=0;i<8;i++)
            for(j=0;j<8;j++)
                T[i][j]=abs(x[i]-x[j])+abs(y[i]-y[j]);
        for(j=1;j<=3;j++)
            if(c[j]<T[2*j-1][2*j])
                T[2*j-1][2*j]=T[2*j][2*j-1]=c[j];
        for(j=1;j<8;j++)
            D[j]=oo;
        Q.resize(0);
        Q.push_back(0);q[0]=1;
        for(;Q.size();)
        {
            i=Q.front();
            for(j=0;j<8;j++)
                if(D[i]+T[i][j]<D[j])
                {
                    D[j]=D[i]+T[i][j];
                    if(!q[j])
                    {
                        q[j]=1;
                        Q.push_back(j);
                    }
                }
            Q.pop_front();
            q[i]=0;
        }
        cout<<D[7];//printf("%d\n",D[7]);
    }
    return 0;
}