Cod sursa(job #637077)

Utilizator AndrewTheGreatAndrei Alexandrescu AndrewTheGreat Data 20 noiembrie 2011 11:38:47
Problema Portal3 Scor 0
Compilator cpp Status done
Runda .com 2011 Marime 1.85 kb
#include <iostream>
#include <fstream>
#include <string.h>

using namespace std;

const int oo = 0x7f7f7f7f;

int D[10], V[10], C[10][10];

int Dijkstra()
{
    memset(D, oo, sizeof(D));
    memset(V, 0, sizeof(V));
    D[0] = 0;
    int i, j, mini, poz;
    for(i = 0; i <= 7; i++)
    {
        mini = oo, poz = 0;
        for(j = 0; j <= 7; j++)
            if(D[j] < mini && !V[j])
                mini = j, poz = j;

        for(j = 0; j <= 7; j++)
            if(D[j] > D[poz] + C[poz][j])
                D[j] = D[poz] + C[poz][j];

        V[poz] = 1;
    }

    return D[7];
}

inline int abs(int x)
{
    if(x < 0)
        return -x;
    return x;
}

int P[10][10];

int main()
{
    ifstream in ("portal3.in");
    ofstream out("portal3.out");

    int T, N, M, X1, X2, Y1, Y2, C1, i, j;
    in >> T;
    while(T--)
    {
        memset(C, oo, sizeof(C));
        in >> N >> M;
        for(i = 0; i < 3; i++)
        {
            in >> X1 >> Y1 >> X2 >> Y2 >> C1;
            C[1 + 2 * i][0] = C[0][1 + 2 * i] = X1 + Y1;
            C[2 + 2 * i][0] = C[0][2 + 2 * i] = X2 + Y2;
            C[2 * i + 2][2 * i + 1] = C[2 * i + 1][2* i + 2] = min(abs(X2 - X1) + abs(Y2 - Y1), C1);
            C[7][2 * i + 1] = C[1 + 2 * i][7] = N - X1 + M - Y1;
            C[7][2 * i + 2] = C[2 * i + 2][7] = N + M - X2 - Y2;

            P[2 * i + 1][1] = X1;
            P[2 * i + 1][2] = Y1;
            P[2 * i + 2][1] = X2;
            P[2 * i + 2][2] = Y2;

            for(j = 2 * i; j > 0; j--)
            {
                C[j][2 * i + 1] = C[2 * i + 1][j] = abs(P[j][1] - X1) + abs(P[j][2] - Y1);
                C[j][2 * i + 2] = C[2 * i + 2][j] = abs(P[j][1] - X2) + abs(P[j][2] - Y2);
            }
        }

        C[0][7] = C[7][0] = N + M;

        out << Dijkstra() << '\n';
    }
    return 0;
}