Untitled

 avatar
unknown
plain_text
2 years ago
1.5 kB
6
Indexable
#include<iostream>
using namespace std;

int n;
int energy[1000][1000];
int minEnergy[1000];
int visit[1000],x[1000],y[1000],r[1000];

int calEnergy(int x1, int y1, int r1, int x2, int y2, int r2)
{
	if( (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2) <= (40+r1+r2)*(40+r1+r2)) return 1;
	else if( (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2) <= (90+r1+r2)*(90+r1+r2)) return 200;
	return 99999;
}

int main()
{
	//freopen("input.txt","r",stdin);
	int t;
	cin >> t;
	for (int tc = 1; tc<=t; tc++)
	{
		cin >> n;
		for (int i=0 ; i<n; i++)
			cin >> x[i] >> y[i] >> r[i];
		for (int i=0; i<n; i++)
		{
			visit[i] = 0;
			minEnergy[i] = 99999;
		}

		for (int i = 0; i<n; i++)
			for (int j=0; j<n; j++)
			{
				if (i == j) energy[i][j] = 0;
				else energy[i][j] = calEnergy(x[i],y[i],r[i],x[j],y[j],r[j]);
			}
		int selected = 0;
		minEnergy[0] = 0;
		int nearleaf, nearDist;
		while (selected < n)
		{
			nearDist = 99999;
			for (int i=0; i<n; i++)
				if (visit[i] == 0 && minEnergy[i] < nearDist)
				{
					nearDist = minEnergy[i];
					nearleaf = i;
				}
			if (nearDist == 99999||selected == n-1) break;
			selected++;
			visit[nearleaf] = 1;
			for (int i=0; i<n;i++)
			{
				if (visit[i] == 0 && minEnergy[nearleaf] + energy[nearleaf][i] < minEnergy[i])
				{
					minEnergy[i] = minEnergy[nearleaf] + energy[nearleaf][i] ;
				} 
			}
		}
		if (minEnergy[n-1] == 99999) cout << "-1" << endl;
		else cout << minEnergy[n-1]/200 <<" " << minEnergy[n-1]%200 << endl;
	}
	return 0;
}
Editor is loading...