好久没记录了,近来忙一个http服务器的搭设活动,遇上了一堆新问题,而且不停地在后端遇上段错误。。感觉还是应该完全转到c++啊。html倒确实是一种有意思的记录方法。
说回今天的题目,简单来说就是找到变种单源最短路径,其中两点路径距离定义为其经过的“最短路径"上的最长边长度。虽然有所改变,但是容易验证其仍然符合松弛操作所须的三角不等式等相应性质,故将relax(u,v,w)中的加定义为广义加(取两者中的较大者),进行代换即可解出。】
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
#define MAXN 203
#define INF 1e10
int n;
typedef struct point {
int x;
int y;
double minDistance;
bool isValid;
}Point;
vector<Point > vertices;
double dis(int i, int j)
{
return sqrt((double )(vertices[i].x-vertices[j].x)*(vertices[i].x-vertices[j].x)
+(vertices[i].y-vertices[j].y)*(vertices[i].y-vertices[j].y));
}
void init()
{
vertices.clear();
Point temp;
temp.isValid = true;
temp.minDistance = INF;
for (int i = 0; i < n; i++) {
scanf("%d %d", &temp.x, &temp.y);
vertices.push_back(temp);
}
vertices[0].minDistance = 0;
}
int extractMin()
{//return its chabiau geih vertices
int tempMinIndex, tempMin;
tempMinIndex = -1;
tempMin = INF+1;
for (int i = 0; i < vertices.size(); i++) {
if (vertices[i].isValid&&vertices[i].minDistance < tempMin) {
tempMin = vertices[i].minDistance;
tempMinIndex = i;
}
}
if (tempMinIndex < 0)
return -1;
vertices[tempMinIndex].isValid = false;
return tempMinIndex;
}
void dijkstra()
{
int u;
u = extractMin();
while (u >= 0) {
for (int i = 0; i < vertices.size(); i++) {
if (vertices[i].isValid) {
if (vertices[i].minDistance > max(vertices[u].minDistance, dis(i, u)))
vertices[i].minDistance = max(vertices[u].minDistance, dis(i, u));
}
}
u = extractMin();
}
}
double minDistance() { return vertices[1].minDistance; }
int main()
{
int scenarioNumber = 1;
while (scanf("%d", &n) != EOF&&n) {
init();
dijkstra();
printf("Scenario #%d\nFrog Distance = %.3lf\n\n", scenarioNumber++, minDistance());
}
return 0;
}