Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u
Description
Input
Output
Sample Input
3 1 1 2 3 3 1 4 1 1 2 3 3 1 4 2
Sample Output
6.47 7.89
解题:据说是双调dp,看不懂,费用流貌似也可以解。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #include <algorithm> 6 #include <climits> 7 #include <vector> 8 #include <queue> 9 #include <cstdlib> 10 #include <string> 11 #include <set> 12 #define LL long long 13 #define INF 0x3f3f3f3f 14 using namespace std; 15 struct point{ 16 int x,y; 17 }p[10010]; 18 bool cmp(const point &a,const point &b){ 19 return (a.x > b.x || a.x == b.x && a.y > b.y); 20 } 21 double dis(point a,point b){ 22 double temp = (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y); 23 return sqrt(temp); 24 } 25 double ds[1010][1010],dp[1010][1010]; 26 int main(){ 27 int n,i,j; 28 double ans = 0; 29 while(~scanf("%d",&n)){ 30 for(i = 0; i < n; i++) 31 scanf("%d%d",&p[i].x,&p[i].y); 32 sort(p,p+n,cmp); 33 for(i = 1; i <= n; i++){ 34 for(j = 1; j <= n; j++){ 35 dp[i][j] = INF; 36 ds[i][j] = dis(p[i-1],p[j-1]); 37 } 38 } 39 dp[1][1] = 0; 40 for(i = 2; i <= n; i++){ 41 for(j = 1; j <= n; j++){ 42 dp[i][j] = min(dp[i][j],dp[i-1][j]+ds[i][i-1]); 43 dp[i][i-1] = min(dp[i][i-1],dp[i-1][j]+ds[j][i]); 44 } 45 } 46 printf("%.2f\n",dp[n][n-1]+ds[n][n-1]); 47 } 48 return 0; 49 }
xtu read problem training B - Tour,布布扣,bubuko.com
xtu read problem training B - Tour
原文:http://www.cnblogs.com/crackpotisback/p/3880468.html