Advertisement
Guest User

Robinzon

a guest
Jun 21st, 2016
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.57 KB | None | 0 0
  1. #include "stdafx.h"
  2. #include <iostream>
  3. #include <cmath>
  4. #include <queue>
  5. using namespace std;
  6.  
  7. #define LIM 100
  8. const int INF = 1000000000;
  9.  
  10. double gip(int a, int b)
  11. {
  12.     return sqrt(a*a + b*b);
  13. }
  14. double func(int rect1[4], int rect2[4])
  15. {  
  16.     if((rect1[0] >= rect2[0] && rect1[0] <= rect2[2]) || (rect1[2] >= rect2[0] && rect1[2] <= rect2[2]))
  17.     {
  18.         int y1 = abs(rect2[1] - rect1[3]);
  19.         int y2 = abs(rect2[3] - rect1[1]);
  20.         if(y1 < y2) return y1;
  21.         return y2;
  22.     }    
  23.     if((rect1[1] >= rect2[1] && rect1[1] <= rect2[3]) || (rect1[3] >= rect2[1] && rect1[3] <= rect2[3]))
  24.     {
  25.         int x1 = abs(rect2[0] - rect1[2]);
  26.         int x2 = abs(rect2[2] - rect1[0]);
  27.         if(x1 < x2) return x1;
  28.         return x2;
  29.     }
  30.    
  31.     if(rect1[2] < rect2[0] && rect1[3] < rect2[1])
  32.     {
  33.         int a = rect2[0] - rect1[2];
  34.         int b = rect2[1] - rect1[3];
  35.         return gip(a, b);
  36.     }
  37.     if(rect1[2] > rect2[0] && rect1[3] < rect2[1])
  38.     {
  39.         int a = rect1[0] - rect2[2];
  40.         int b = rect2[1] - rect1[3];
  41.         return gip(a, b);
  42.     }
  43.     if(rect1[2] < rect2[0] && rect1[3] > rect2[1])
  44.     {
  45.         int a = rect2[0] - rect1[2];
  46.         int b = rect1[1] - rect2[3];
  47.         return gip(a, b);
  48.     }
  49.     if(rect1[2] > rect2[0] && rect1[3] > rect2[1])
  50.     {
  51.         int a = rect1[0] - rect2[2];
  52.         int b = rect1[1] - rect2[3];
  53.         return gip(a, b);
  54.     }
  55.     return 0;
  56. }
  57.  
  58. double prima(double (&arr)[LIM][LIM], int N)
  59. {  
  60.     for(int i = 0; i < N; i++)
  61.         for(int j = 0; j < N; j++)
  62.             if(arr[i][j] == 0) arr[i][j] = INF;    
  63.     vector <double> mindist (N, INF);
  64.     vector <double> dist (N, INF);
  65.     dist[0] = 0;
  66.     vector <bool> used (N, false);
  67.     int ans = 0;
  68.     for (int i = 0; i < N; ++i)
  69.     {
  70.         double min_dist = INF;
  71.         int u;
  72.         for (int j = 0; j < N; ++j)
  73.             if (!used[j] && dist[j] < min_dist)
  74.             {
  75.                 min_dist = dist[j];            
  76.                 u = j;
  77.             }
  78.         ans += min_dist;
  79.         mindist[i] = min_dist;
  80.         used[u] = true;
  81.         for (int v = 0; v < N; ++v)
  82.             dist[v] = min(dist[v], arr[u][v]);
  83.     }
  84.     double max = 0.0;
  85.     for(int i = 0; i < N; i++)
  86.         if(mindist[i] > max) max = mindist[i];
  87.     return max;
  88. }
  89.  
  90. int main()
  91. {
  92.     int n;
  93.     int rect[LIM][4];
  94.     double mat[LIM][LIM];
  95.  
  96.     cin >> n;
  97.     /*
  98.     for(int i = 0; i < n; i++)
  99.         for(int j = 0; j < 4; j++)
  100.             cin >> rect[i][j];
  101.    
  102.  
  103.     for(int i = 0; i < n; i++)
  104.         for(int j = 0; j < n; j++)
  105.             mat[i][j] = 0;
  106.  
  107.     for(int i = 0; i < n; i++)
  108.         for(int j = 0; j < n; j++)
  109.             if(i != j && mat[i][j] == 0)
  110.             {              
  111.                 mat[i][j] = func(rect[i], rect[j]);
  112.                 mat[j][i] = mat[i][j];
  113.             }
  114.     */
  115.     double mas[LIM][LIM];
  116.     for(int i = 0; i < n; i++)
  117.         for(int j = 0; j < n; j++)
  118.             cin >> mas[i][j];
  119.  
  120.  
  121.     printf("%.3f", prima(mas, n));
  122.  
  123.     cin >> n;
  124.     return 0;
  125. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement