题目大意:
农夫FJ想把他所有的牛在它们吃草的时候用一根绳子连起来(就是1-2-3-1按顺序连接起来),每头牛有若干个吃草的位置,它们必须要在这些位置吃草。 用绳子连接两头牛需要绳子的长度公式为 Sqrt( Sqr( x1-x2 ) + Sqr( y1-y2 ) ) ,农夫FJ希望需要的那根绳子长度最短,他需要你帮他求出这个最短的长度是多少。
代码:
#include<iostream>
#include<fstream>
#include<cmath>using namespace std;int n;
int num[101];double x[101][41];
double y[101][41];double dp[101][41];void read(){
// ifstream cin("in.txt");int i,j,k,s;cin>>n;for(i=1;i<=n;i++){cin>>num[i];for(j=1;j<=num[i];j++)cin>>x[i][j]>>y[i][j];}double ans=-1;for(i=1;i<=num[1];i++){for(j=1;j<=num[2];j++)dp[2][j]=sqrt((x[2][j]-x[1][i])*(x[2][j]-x[1][i])+(y[2][j]-y[1][i])*(y[2][j]-y[1][i]));for(j=3;j<=n;j++)for(k=1;k<=num[j];k++){dp[j][k]=100000000;for(s=1;s<=num[j-1];s++)dp[j][k]=min(dp[j][k],dp[j-1][s]+sqrt((x[j-1][s]-x[j][k])*(x[j-1][s]-x[j][k])+(y[j-1][s]-y[j][k])*(y[j-1][s]-y[j][k])));}double t=100000000;for(j=1;j<=num[n];j++){t=min(t,dp[n][j]+sqrt((x[n][j]-x[1][i])*(x[n][j]-x[1][i])+(y[n][j]-y[1][i])*(y[n][j]-y[1][i])));}if(ans==-1) ans=t;else ans=min(ans,t);}printf("%d\n",(int)(100*ans));}int main(){read();return 0;
}