当前位置: 代码迷 >> 综合 >> POJ - 2253 Frogger(最小化最大边)
  详细解决方案

POJ - 2253 Frogger(最小化最大边)

热度:93   发布时间:2023-12-17 02:52:26.0

从第一个点到第二个点,在所有的路径中,选择一条路径,使得这条路径的最大边比其他路径的最大边小。是小数,记得使用double,记得数组大小,记得路径是双向的,不要犯zz错误(我是zz)。

判断条件:d[v] > max(es[i].w, d[u]);

关键式:d[v] = max(es[i].w, d[u]);

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <set>
#include <map>
#include <stack>
#include <queue>
#define inf 0x3f3f3f3fusing namespace std;const int maxn = 205;int n, s, t, p = 0;   //n为点数 s为源点
int head[maxn]; //head[from]表示以head为出发点的邻接表表头在数组es中的位置,开始时所有元素初始化为-1
double d[maxn]; //储存到源节点的距离,在Spfa()中初始化
int cnt[maxn];
bool inq[maxn]; //这里inq作inqueue解释会更好,出于习惯使用了inq来命名,在Spfa()中初始化
int nodep;  //在邻接表和指向表头的head数组中定位用的记录指针,开始时初始化为0
double a[maxn], b[maxn];  //记录坐标struct node {int v, next;double w;
}es[100005];void init() {for(int i = 1; i <= n; i++) {d[i] = inf;inq[i] = false;cnt[i] = 0;head[i] = -1;}nodep = 0;
}void addedge(int from, int to, double weight)
{es[nodep].v = to;es[nodep].w = weight;es[nodep].next = head[from];head[from] = nodep++;
}void spfa()
{queue<int> que;d[s] = 0;    //s为源点inq[s] = 1;que.push(s);while(!que.empty()) {int u = que.front();que.pop();inq[u] = false;   //从queue中退出//遍历邻接表for(int i = head[u]; i != -1; i = es[i].next) {  //在es中,相同from出发指向的顶点为从head[from]开始的一项,逐项使用next寻找下去,直到找到第一个被输//入的项,其next值为-1int v = es[i].v;if(d[v] > max(es[i].w, d[u])) { //松弛(RELAX)操作d[v] = max(es[i].w, d[u]);if(!inq[v]) {      //若被搜索到的节点不在队列que中,则把to加入到队列中去inq[v] = true;que.push(v);}}}}
}int main()
{while(cin >> n && n) {init();p++;double c;for(int i = 1; i <= n; i++) {cin >> a[i] >> b[i];}for(int i = 1; i <= n; i++) {for(int j = i; j <= n; j++) {c = sqrt((a[i] - a[j]) * (a[i] - a[j]) + (b[i] - b[j]) * (b[i] - b[j]));addedge(i, j, c);addedge(j, i, c);}}s = 1, t = 2;spfa();printf("Scenario #%d\nFrog Distance = %.3lf\n\n", p, d[t]);}return 0;
}