Cod sursa(job #1458879)

Utilizator felixiPuscasu Felix felixi Data 8 iulie 2015 17:32:09
Problema Portal3 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.67 kb
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

#define MAX_N 10

#define inf 2000000000

ifstream f("portal3.in");
ofstream g("portal3.out");

int n, m, k, t;

int cost[MAX_N][MAX_N];

struct point {
    int x, y;
} P[MAX_N];

int solve() {
    int use[MAX_N], dist[MAX_N];
    for (int i = 0; i < MAX_N; i++) {
        use[i] = 0;
        dist[i] = inf;
    }
    dist[1] = 0;

    for (int pmin = 1; pmin != 8;) {
        use[pmin] = 1;

        for (int i = 1; i <= 8; i++)
            if (dist[i] > 1LL * dist[pmin] + 1LL * cost[pmin][i])
                dist[i] = dist[pmin] + cost[pmin][i];

        pmin = 8;

        for (int i = 1; i <= 8; i++)
            if (use[i] == 0 && dist[i] < dist[pmin])
                pmin = i;
    }

    return dist[8];
}

int main() {

    for (f >> t; t; t--) {
        k = 1; P[k].x = P[k].y = 0;

        f >> n >> m;
        for (int i = 1; i <= 3; i++) {
            k++;
            f >> P[k].x >> P[k].y;

            for (int j = 1; j < k; j++)
                cost[j][k] = cost[k][j] = abs(P[j].x - P[k].x) + abs(P[j].y - P[k].y);

            k++;
            f >> P[k].x >> P[k].y;

            for (int j = 1; j < k; j++)
                cost[j][k] = cost[k][j] = abs(P[j].x - P[k].x) + abs(P[j].y - P[k].y);

            int C;
            f >> C;

            cost[k - 1][k] = cost[k][k - 1] = min(cost[k - 1][k], C);
        }

        k++; P[k].x = n; P[k].y = m;
        for (int j = 1; j < k; j++)
            cost[j][k] = cost[k][j] = abs(P[j].x - P[k].x) + abs(P[j].y - P[k].y);

        g << solve() << "\n";
    }

    return 0;
}