Cod sursa(job #638557)

Utilizator a_h1926Heidelbacher Andrei a_h1926 Data 20 noiembrie 2011 22:29:23
Problema Portal3 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
#include <fstream>

#define Infinity 1000000000000LL

using namespace std;

ifstream fin ("portal3.in");
ofstream fout ("portal3.out");

long long C[10][10], X[10], Y[10], D[10];

inline long long Abs (long long x)
{
    if (x<0)
    {
        return -x;
    }
    return x;
}

inline long long Dist (int i, int j)
{
    return Abs (X[i]-X[j])+Abs (Y[i]-Y[j]);
}

inline long long Min (long long a, long long b)
{
    if (a<b)
    {
        return a;
    }
    return b;
}

void Read ()
{
    int N, M;
    fin >> N >> M;
    X[1]=Y[1]=0;
    X[8]=N;
    Y[8]=M;
    for (int i=2; i<=7; i+=2)
    {
        for (int j=0; j<=1; ++j)
        {
            fin >> X[i+j] >> Y[i+j];
        }
        long long c;
        fin >> c;
        C[i][i+1]=c;
        C[i+1][i]=c;
    }
    for (int i=1; i<=8; ++i)
    {
        for (int j=1; j<=8; ++j)
        {
            if (i==j)
            {
                continue;
            }
            C[i][j]=Min (C[i][j], Dist (i, j));
        }
    }
}

inline void Print ()
{
    fout << D[8] << "\n";
}

void BellmanFord ()
{
    for (int i=1; i<=8; ++i)
    {
        for (int j=1; j<=8; ++j)
        {
            for (int k=1; k<=8; ++k)
            {
                if (D[j]+C[j][k]<D[k])
                {
                    D[k]=D[j]+C[j][k];
                }
            }
        }
    }
}

void Initialize ()
{
    for (int i=0; i<=8; ++i)
    {
        D[i]=Infinity;
        for (int j=0; j<=8; ++j)
        {
            C[i][j]=Infinity;
        }
    }
    D[1]=0;
}

int main()
{
    int T;
    fin >> T;
    for (; T>0; --T)
    {
        Initialize ();
        Read ();
        BellmanFord ();
        Print ();
    }
    return 0;
}