Cod sursa(job #1709261)

Utilizator TeamFIIDUAIC backtrackers TeamFIID Data 28 mai 2016 11:30:42
Problema Metrou4 Scor 0
Compilator cpp Status done
Runda ONIS 2016 - Runda - 2 - ACM ICPC Romanian Programming Contest Marime 1.53 kb
#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;
		*/
		int vecin;
		int minim = INF;
		for (i = 1; i <= N; i++)
		{
			if (!uz[i] && cmin[i] < minim)
			{
				minim = cmin[i];
				vecin = i;
			}
		}
		uz[vecin] = 1;
		total += minim;
		for (i = 1; i <= N; i++)
		{
			if (!uz[i] && cmin[i] > dist(vecin, i))
			{
				cmin[i] = dist(vecin, 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();*/
}