Pagini recente » Cod sursa (job #412003) | Cod sursa (job #2397231) | Cod sursa (job #2189613) | Cod sursa (job #3175202) | Cod sursa (job #1709236)
#include <cstdio>
#include <queue>
#include <iostream>
#define NMAX 150001
#define INF 1<<30
using namespace std;
int T,N;
struct punct
{
int x, y;
}P[NMAX];
int cmin[NMAX],total;
bool uz[NMAX];
priority_queue <pair<int, int> > pq;
int dist(int i, int j);
void reset();
void apm();
int modul(int x)
{
if (x < 0) return -x;
return x;
}
int main()
{
freopen("metrou4.in", "r", stdin);
freopen("metrou4.out", "w", stdout);
cin >> T;
int test; int i;
for (test = 0; test < T; test++)
{
cin >> N;
reset();
for (i = 1; i <= N; i++)
cin >> P[i].x >> P[i].y;
apm();
cout << total << '\n';
}
return 0;
}
void apm()
{
int i;
uz[1] = 1;
for (i = 2; i <= N; i++)
{
pq.push(make_pair(-dist(1, i), i));
cmin[i] = dist(1, i);
}
int nr = 2;
for (nr = 2; nr <= N; nr++)
{
while (uz[pq.top().second] == 1)
pq.pop();
int vecin = pq.top().second;
total -= pq.top().first; // adaug nodul la apm;
uz[vecin] = 1;
for (i = 1; i <= N; i++)
{
if (!uz[i] && cmin[i] > dist(vecin, i))
{
cmin[i] = dist(vecin, i);
pq.push(make_pair(-dist(vecin, i), i));
}
}
}
}
int dist(int i, int j)
{
int d = 0;
d = modul(P[i].x - P[j].x) + modul(P[i].y - P[j].y);
return d;
}
void reset()
{
int i;
for (i = 1; i <= N; i++)
{
cmin[i] = INF;
uz[i] = 0;
}
total = 0;
while (!pq.empty())
pq.pop();
}