有两只青蛙A和B,以及n-2个节点,这n个节点两两相连,边权为节点之间的距离。显然,青蛙A是必定可以到达青蛙B的,设所有路径集合为S,求路径a属于S,使路径a的最大边权在路径集合S中最小。
这题当时是借鉴了bellman-ford算法的思路解决的,现在发现用dijkstra的思路也可以解。。。
核心思路是 edge[s][d] = max( min( edge[s][k]), min( edge[k][d]) )
//Memory Time
//528K 16MS
#include<iostream>
#include<stdio.h>
#include<queue>
#include<cmath>
using namespace std;
struct coord
{
double x;
double y;
};
double vexCost[200];
bool isAddToQueue[200];
coord cord[200];
double edge[200][200];
int main()
{
int stoneNum;
int loopNum = 0;
while(cin >> stoneNum && stoneNum != 0)
{
loopNum++;
for(int i = 0; i < stoneNum; i++)
{
cin >> cord[i].x >> cord[i].y;
for(int j = 0; j <= i; j++)
{
double dis = ((cord[i].x - cord[j].x) * (cord[i].x - cord[j].x));
dis += ((cord[i].y - cord[j].y) * (cord[i].y - cord[j].y));
dis = sqrt(dis);
edge[i][j] = dis;
edge[j][i] = dis;
}
}
for(int i = 0; i < stoneNum; i++)
{
isAddToQueue[i] = false;
vexCost[i] = 1E8;
}
vexCost[0] = 0;
queue<int> que;
que.push(0);
isAddToQueue[0] = true;
while(!que.empty())
{
int tempV = que.front();
que.pop();
isAddToQueue[tempV] = false;
for(int i = 0; i < stoneNum; i++)
{
double tempMax;
if(edge[tempV][i] > vexCost[tempV])
tempMax = edge[tempV][i];
else
tempMax = vexCost[tempV];
if(tempMax < vexCost[i])
{
vexCost[i] = tempMax;
if(isAddToQueue[i] == false)
{
que.push(i);
isAddToQueue[i] = true;
}
}
}
}
printf("Scenario #%d\nFrog Distance = %.3f\n\n",loopNum,vexCost[1]);
}
return 0;
}