POJ

来源:互联网 发布:三坐标编程工资待遇 编辑:程序博客网 时间:2024/04/29 03:22

                 题意:给定n个点的坐标,问从第一个点到第二个点的最小跳跃范围。d(i)表示从第一个点到达第i个点的最小跳跃范围.

AC代码

#include <cstdio>#include <cmath>#include <cctype>#include <algorithm>#include <cstring>#include <utility>#include <string>#include <iostream>#include <map>#include <set>#include <vector>#include <queue>#include <stack>using namespace std;#pragma comment(linker, "/STACK:1024000000,1024000000") #define eps 1e-10#define inf 0x3f3f3f3f#define PI pair<int, int> typedef long long LL;const int maxn = 200 + 5;int d[maxn], vis[maxn];struct node{int x, y;}a[maxn];struct HeapNode{int d, u;HeapNode() {}HeapNode(int d, int u):d(d), u(u) {}bool operator < (const HeapNode &p) const {return d > p.d;}};void dijkstra(int s, int n) {priority_queue<HeapNode>q;memset(d, inf, sizeof(d));d[0] = 0;memset(vis, 0, sizeof(vis));q.push(HeapNode(0, 0));while(!q.empty()) {HeapNode p = q.top(); q.pop();int u = p.u;if(vis[u]) continue;vis[u] = 1;for(int i = 0; i < n; ++i) {if(u == i) continue;int dis = (a[u].x - a[i].x)*(a[u].x - a[i].x) + (a[u].y - a[i].y)*(a[u].y - a[i].y);dis = max(dis, d[u]);if(d[i] > dis) {d[i] = dis;q.push(HeapNode(d[i], i));}}} }int main() {int n, kase = 1;while(scanf("%d", &n) == 1 && n) {for(int i = 0; i < n; ++i) scanf("%d%d", &a[i].x, &a[i].y);dijkstra(0, n);printf("Scenario #%d\n", kase++);printf("Frog Distance = %.3f\n\n", sqrt((double)d[1]));}return 0;}

如有不当之处欢迎指出!

0 0
原创粉丝点击