题意:
一只母老鼠想要找到她的玩具,而玩具就丢在一个广阔的3维空间上某个点,而母老鼠在另一个点,她可以直接走到达玩具的位置,但是耗时是所走过的欧几里得距离*10s。还有一种方法,就是靠钻洞,洞是球形的,在洞内怎么走都是不耗时间的。求母老鼠找到她的玩具所耗时?
分析:
洞到洞的最短距离都是圆心距离减去半径。剩下的就是求单源最短路径。
代码:
#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>#include <cmath>#include <map>using namespace std;typedef long long ll;const int maxn=102;int x[maxn],y[maxn],z[maxn],r[maxn];double g[maxn][maxn];int vis[maxn];double d[maxn];double INF = 1e9;ll ping(ll x){ return x*x;}double dist(int i,int j){ return sqrt(ping(x[i]-x[j])+ping(y[i]-y[j])+ping(z[i]-z[j]))-r[i]-r[j];}double dijkstra(int n){ for(int i=1;i<n;i++) d[i]=INF; memset(vis,0,sizeof(vis)); for(int i=0;i<n;i++) { int x; double m = INF; for(int y=0;y<n;y++) if(!vis[y]&&d[y]<m) m=d[x=y]; if(x==n-1) return d[n-1]; vis[x]=1; for(int y=0;y<n;y++) d[y]=min(d[y],d[x]+g[x][y]); } return INF;}int main(){ int n,cas=0; while(scanf("%d",&n)&&n>=0) { memset(r,0,sizeof(r)); int i,j; for(i=1;i<=n;i++) scanf("%d%d%d%d",&x[i],&y[i],&z[i],&r[i]); scanf("%d%d%d",&x[0],&y[0],&z[0]); scanf("%d%d%d",&x[n+1],&y[n+1],&z[n+1]); //<<1<<endl; for(i=0;i<=n+1;i++) { for(j=i+1;j<=n+1;j++) { g[i][j]=max(0.0,dist(i,j)); g[j][i]=g[i][j]; } } printf("Cheese %d: Travel time = %.0lf sec\n",++cas,dijkstra(n+2)*10); }}
时间: 2024-08-13 14:46:35