uva 1001 dijkstra

来源:互联网 发布:四大网络交流平台 编辑:程序博客网 时间:2024/06/02 04:04
#include <bits/stdc++.h>using namespace std;#define RPE(i,n) for(int i=0;i<(n);i++)const int N = 110;typedef  pair<int, int> pii;typedef  pair<double, int> pdi;typedef long long LL;int x[N], y[N], z[N], r[N];double dist[N][N];double sdist[N];int vis[N], kase, n;LL dijkstra(int n){memset(vis, 0, sizeof(vis));for (int i = 0; i <= n; i++) sdist[i] = 1e29;priority_queue<pdi, vector<pdi>, greater<pdi> >   que;que.push(make_pair(0.0, 0));sdist[0] = 0.0;while (!que.empty()){int x = que.top().second; que.pop();if (vis[x]) continue;vis[x] = 1;for (int i = 0; i <= n; i++){if ( sdist[i] > sdist[x] + dist[x][i] ){sdist[i] = sdist[x] + dist[x][i];que.push(make_pair(sdist[i], i));}}}return round(sdist[n] * 10) + 0.5;}void distan(int n){for (int i = 0; i <= n + 1; i++)for (int j = 0; j <= n + 1; j++){dist[i][j] = 0.0;dist[i][j] = sqrt( pow(x[i] - x[j], 2) + pow(y[i] - y[j], 2) + pow(z[i] - z[j], 2) ) - r[i] - r[j];if (dist[i][j] < 1e-7)  dist[i][j] = 0;}}int main(int argc, char const *argv[]){while (cin >> n && n > 0){memset(r, 0, sizeof(r));for (int i = 1; i <= n; i++)cin >> x[i] >> y[i] >> z[i] >> r[i];cin >> x[0] >> y[0] >> z[0] ;cin >> x[n + 1] >> y[n + 1] >> z[n + 1] ;distan(n);cout << "Cheese " << ++kase << ": Travel time = " << dijkstra(n + 1) << " sec\n";}return 0;}

0 0