还是青蛙跳那题 这回用dijksta做的
此题不是最短路也不是最小生成树,而是FLOYD变体
floyd :
http://blog.csdn.net/u012550356/article/details/19178115
Dijkstra算法基本步骤
•D的初始状态为:
如果从源点
s
到顶点
v
有弧则
D[v]
记为弧的权值;否则将
D[v]
置为无穷大。
•
•每次从尚未确定最短路径长度的集合
V-S中取出一个最短
特殊路径长度最小的顶点u,将u加入集合S,同时修改数组D中由s可达的最短路径长度:
若加进
u
做中间顶点,使得
vi
的最短特殊路径长度变短,则修改
vi
的距离值(即当D[u]+ W[u, vi] < D[vi]时,令D[vi]= D[u] + W[u, vi])。
•
•然后重复上述操作,一旦S包含了所有V中的顶点,D中各顶点的距离值就记录了从源点s到该顶点的最短路径长度。
•
这道题不是纯粹的最短路,是它的变形
#include <cstdio>
#include <iostream>
#include <string.h>
#include <math.h>
#include <fstream>
#define __max(a,b) ((a)>(b)?(a):(b))
#define __min(a,b) ((a)<(b)?(a):(b))
#define INF 0x3f3f3f3f
using namespace std;
const int maxn=202;
int n;
struct point
{
double x;
double y;
}p[maxn];
double d[maxn]; // 数组d来记录当前所找到的从源点s到每个顶点的最长权值长度
double dis[maxn][maxn]; //各个点间的距离
int vis[maxn];
double Distance(double x1,double y1,double x2,double y2)
{
return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
void dijkstra()
{
memset(vis,0,sizeof(vis));
for(int i=0;i<n;i++) d[i]=0x3f3f3f3f; //队列先都无穷大
//memset(d,0x3f,sizeof(d)); //这个不能用在double里,只能在int里
d[0]=0;
for (int i = 0; i < n; ++i)
{
double small=INF;
int k;
for (int j = 0; j < n; ++j) //在从起点到各个点的距离中选出一个未标记的最小的
if(!vis[j] && small>d[j] )
small = d[k=j];
vis[k]=1;
for (int j = 0; j < n; ++j) //修改数组d中由s可达的最短权值长度
d[j]=__min(d[j],__max(d[k],Distance(p[k].x,p[k].y,p[j].x,p[j].y)));
}
}
int main()
{
//ifstream cin("input.txt");
int kase=0 ;
while(cin>>n,n){
kase ++;
for(int i=0;i<n;i++)
cin>>p[i].x>>p[i].y;
dijkstra();
printf("Scenario #%d\nFrog Distance = %.3f\n\n",kase,d[1] );
}
}
这回只用了47MS 快多了