Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- #include <cstdio>
- #include <cstdlib>
- #include <cmath>
- #include <algorithm>
- #include <iomanip>
- using namespace std;
- struct line {
- float x[ 2 ], y[ 2 ];
- };
- line a[ 100 ];
- int n;
- float dp[ 30 ][ 35000 ];
- float dist( float x1, float x2, float y1, float y2 ) {
- return sqrt( ( x1 - x2 ) * ( x1 - x2 ) + ( y1 - y2 ) * ( y1 - y2 ) );
- }
- int main() {
- cin >> n;
- for( int i = 0; i < n; i ++ ) {
- cin >> a[ i ].x[ 0 ] >> a[ i ].y[ 0 ] >> a[ i ].x[ 1 ] >> a[ i ].y[ 1 ];
- }
- for( int i = 0; i < 30; i ++ ) {
- dp[ i ][ 0 ] = 0;
- }
- for( int i = 0; i < n; i ++ ) {
- for( int j = 0; j < 2; j ++ ) {
- int cur = i * 2 + j;
- for( int k = 1; k < ( 1 << n ); k ++ ) {
- if( k & ( 1 << i ) ) {
- continue;
- }
- dp[ cur ][ k ] = 1000000000;
- float mini = dp[ cur ][ k ], best;
- for( int b = 0; b < n; b ++ ) {
- if( ! ( k & ( 1 << b ) ) )
- continue;
- float oldmi = mini;
- 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 ] ) );
- 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 ] ) );
- if( oldmi != mini )
- best = b;
- }
- dp[ cur ][ k ] = mini;
- if( __builtin_popcount( k ) == n - 1 ) {
- cout << dp[ cur ][ k ] << '\n';
- }
- }
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement