Pagini recente » Cod sursa (job #816425) | Cod sursa (job #146920) | Cod sursa (job #2281307) | Cod sursa (job #2949253) | Cod sursa (job #637099)
Cod sursa(job #637099)
#include <iostream>
#include <fstream>
#include <string.h>
#define i64 long long
using namespace std;
const i64 oo = 0x1010101010101010;
i64 D[10], V[10], C[10][10];
i64 Dijkstra()
{
memset(D, oo, sizeof(D));
memset(V, 0, sizeof(V));
D[0] = 0;
i64 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 i64 abs(i64 x)
{
if(x < 0)
return -x;
return x;
}
i64 P[10][10];
int main()
{
ifstream in ("portal3.in");
ofstream out("portal3.out");
i64 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] = 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;
}