直角坐标系中,有 nn 个点。要求先从左往右走,再从右往左走,不重复的经过每一个点。
求出最短路径(距离为两点间直线距离)。
f [i ][j ] 表示点 1~max(i,j) 已走过,的路径长度
#include <iostream> #include <algorithm> #include <cstring> #include <cmath> #include <iomanip> using namespace std; const int N =1004; int n; int x[N],y[N]; double f[N][N]; double d(int i,int j){ return sqrt((x[i]-x[j])*(x[i]-x[j])+ (y[i]-y[j])*(y[i]-y[j])); } void solve(){ int i,j; memset(f,0,sizeof f); for(i=1;i<=n;i++) scanf("%d %d",&x[i],&y[i]); for(i=1;i<n-1;i++) f[n-1][i] =d(n-1,n)+d(i,n); for(i=n-2;i>=1;i--){ for(j=i-1;j>=1;j--){ f[i][j]=min(f[i+1][j]+d(i,i+1), f[i+1][i]+d(j,i+1)); } } printf("%.2lf\n",f[2][1]+d(2,1)); } signed main(){ while(scanf("%d",&n)==1) solve(); }
标签:旅行,int,double,uva1347,--,Tour,include From: https://www.cnblogs.com/towboa/p/17289650.html