Дам 30 баллов {Для изучения океана планеты Солярис было построено N исследовательских станций. Каждая из станций задаётся координатами (xi, yi, zi) в пространстве. Для быстрого перемещения между станциями запланировано построит...

Дам 30 баллов {Для изучения океана планеты Солярис было построено N исследовательских станций. Каждая из станций задаётся координатами (xi, yi, zi) в пространстве. Для быстрого перемещения между станциями запланировано построить N-1 телепорт, каждый из которых будет соединять две станции и позволит перемещаться между ними в произвольном направлении. Набор телепортов должен соединять все станции, то есть так, чтобы с любой станции до любой другой можно было переместиться либо непосредственно через соединяющий их телепорт, либо использовав несколько телепортов с посещением произвольных станций. Стоимость постройки телепорта между станциями i и j равна cij = min(|xi – xj|, |yi – yj|, |zi – zj|). Напишите программу, которая по положению N исследовательских станций поможет найти минимальную стоимость искомого набора телепортов. Вход: файл input.txt, в первой строке содержится число N – количество исследовательских станций. В следующих N строках содержится описание очередной станции, задаваемой координатами (xi, yi, zi). Координаты разделяются пробелом. Ограничения: 2≤N≤105, -109≤ xi, yi, zi ≤109 Выход: файл output.txt, в единственной строке содержится число – минимальная стоимость постройки набора телепортов.}Язык C++
Гость
Ответ(ы) на вопрос:
Гость
#include #define maxsize 105 typedef struct station{     int x, y, z; } station; int abs(int x){     return x >= 0 ? x : -x; } int min(int a, int b){     return a <= b ? a : b; } int main(){     FILE *ist, *ost;          station s[maxsize];     int w[maxsize][maxsize];     int inc[maxsize];     int n,i,j,k,m,l,r;          ist = fopen("input.txt","r");          fscanf(ist, "%d", &n);     for(i = 0; i < n; i++) fscanf(ist, "%d %d %d", &s[i].x, &s[i].y, &s[i].z);          fclose(ist);          for(i = 0; i < n; i++) inc[i] = 0;          for(i = 0; i < n; i++)     for(j = i; j < n; j++)         w[i][j] = w[j][i] = min(abs(s[i].x - s[j].x), min(abs(s[i].y - s[j].y), abs(s[i].z - s[j].z)) );          r = 0; k = 1;     inc[0] = 1;     while(k < n){         m = -1;         for(i = 0; i < n; i++) if(inc[i])         for(j = 0; j < n; j++) if(!inc[j])             if (m == -1 || w[i][j] < m) m = w[i][j], l = j;         r += m;         inc[l] = 1;         k++;     }          ost = fopen("output.txt","w");     fprintf(ost,"%d", r);     fclose(ost);          return 0; }
Не нашли ответ?
Ответить на вопрос
Похожие вопросы