Advertisement
Guest User

Untitled

a guest
Sep 23rd, 2017
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.71 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <cstdio>
  4. #include <cstdlib>
  5. #include <cmath>
  6. #include <algorithm>
  7. #include <iomanip>
  8. using namespace std;
  9. struct line {
  10.    float x[ 2 ], y[ 2 ];
  11. };
  12. line a[ 100 ];
  13. int n;
  14. float dp[ 30 ][ 35000 ];
  15. float dist( float x1, float x2, float y1, float y2 ) {
  16.    return sqrt( ( x1 - x2 ) * ( x1 - x2 ) + ( y1 - y2 ) * ( y1 - y2 ) );
  17. }
  18. int main() {
  19.    cin >> n;
  20.    for( int i = 0; i < n; i ++ ) {
  21.       cin >> a[ i ].x[ 0 ] >> a[ i ].y[ 0 ] >> a[ i ].x[ 1 ] >> a[ i ].y[ 1 ];
  22.    }
  23.    for( int i = 0; i < 30; i ++ ) {
  24.       dp[ i ][ 0 ] = 0;
  25.    }
  26.    for( int i = 0; i < n; i ++ ) {
  27.       for( int j = 0; j < 2; j ++ ) {
  28.          int cur = i * 2 + j;
  29.          for( int k = 1; k < ( 1 << n ); k ++ ) {
  30.             if( k & ( 1 << i ) ) {
  31.                continue;
  32.             }
  33.             dp[ cur ][ k ] = 1000000000;
  34.             float mini = dp[ cur ][ k ], best;
  35.             for( int b = 0; b < n; b ++ ) {
  36.             if( ! ( k & ( 1 << b ) ) )
  37.                continue;
  38.             float oldmi = mini;
  39.             mini = min( mini, dp[ 2 * b ][ k ^ ( 1 << b ) ] + dist( a[ b ].x[ 0 ], a[ i ].x[ j ], a[ b ].y[ 0 ], a[ i ].y[ j ] ) + dist( a[ b ].x[ 0 ], a[ b ].x[ 1 ], a[ b ].y[ 0 ], a[ b ]. y[ 1 ] ) );
  40.             mini = min( mini, dp[ 2 * b + 1 ][ k ^ ( 1 << b ) ] + dist( a[ b ].x[ 1 ], a[ i ].x[ j ], a[ b ].y[ 1 ], a[ i ].y[ j ] ) + dist( a[ b ].x[ 0 ], a[ b ].x[ 1 ], a[ b ].y[ 0 ], a[ b ]. y[ 1 ] ) );
  41.             if( oldmi != mini )
  42.                best = b;
  43.             }
  44.             dp[ cur ][ k ] = mini;
  45.             if( __builtin_popcount( k ) == n - 1 ) {
  46.                cout << dp[ cur ][ k ] << '\n';
  47.             }
  48.          }
  49.       }
  50.    }
  51.    return 0;
  52. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement