UVA1001 Say Cheese (dijkstra)
2015-08-28 22:27
435 查看
如果没有洞,那么任意两点的最短距离就是直线距离,洞里是瞬间的,所以看成一个点就行了(其实点也可以当作半径为0的洞来处理),洞到洞的最短距离都是圆心距离减去半径。剩下的就是求单源最短路径,是完全图,用不加堆优化的dijkstra就行了O(n^2)。
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 102; int x[maxn],y[maxn],z[maxn],r[maxn]; double g[maxn][maxn]; inline ll squ(ll x) { return x*x; } inline double dist(int i,int j) { return sqrt(squ(x[i]-x[j])+squ(y[i]-y[j])+squ(z[i]-z[j]))-r[i]-r[j]; } double d[maxn]; double INF = 1e9; bool vis[maxn]; double dijkstra(int n,int s = 0,int t = 1) { for(int i = 1; i < n; i++) d[i] = INF; memset(vis,0,sizeof(bool)*n); 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 == t) return d[t]; vis[x] = true; for(int y = 0; y < n; y++) d[y] = min(d[y],d[x]+g[x][y]); } return INF; } int main() { //freopen("in.txt","r",stdin); int n,kas = 0; while(scanf("%d",&n),~n){ n += 2; for(int i = 2; i < n; i++) scanf("%d%d%d%d",x+i,y+i,z+i,r+i); scanf("%d%d%d%d%d%d",x,y,z,x+1,y+1,z+1); for(int i = 0; i < n; i++) for(int j = i+1; j < n; j++){ g[i][j] = max(0.,dist(i,j)); g[j][i] = g[i][j]; } printf("Cheese %d: Travel time = %.0lf sec\n",++kas,dijkstra(n)*10); } return 0; }
相关文章推荐
- UVA821 PageHopping (Floyd)
- 5步避免Java堆空间错误
- 替代NSTimer的block计时器!! !
- Redis中的键值对设计
- JVM内存死锁问题分析
- java产生XML文件
- USACO草地排水
- 字符串与模式匹配(一)——KMP算法
- java异常处理
- 杭电ACM2050java做法
- C++泛型 && Java泛型实现机制
- 【JavaSE】day08_RandomAccessFile
- 减少GC开销的技巧
- bootstrap 和 jqueryui
- 面向对象的方法重写数组功能
- hdu2112 spfa
- java jvm 不同的垃圾回收器的比较
- 总结了一下,关于codeblocks的主题导入
- WPF之分页查询
- lvm基本应用和lvm的扩展及缩减