给出几个坐标,要求从第一个坐标到第二个坐标的路径中最大跳跃距离的最小值
求单源最短路径问题,首先想到用dj算法,不过稍有不同找到一个点后,更新其他点时候需要
dis2[j][1]=MIN(dis2[j][1],MAX(dis2[temp][1],dis2[j][temp]));
也就是如果j 通过temp到达1这个点时候距离比直接到1短,就有可能产生新的值,更新掉...
1 #include <stdio.h>
2 #include <memory.h>
3 #include <math.h>
4 #define MAX( x, y ) ( ((x) > (y)) ? (x) : (y) )
5 #define MIN( x, y ) ( ((x) < (y)) ? (x) : (y) )
6 struct node{
7 int x,y;
8 bool visit;
9 };
10 float ndis(node a,node b){
11
12 return sqrt((float)((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)));
13 }
14 float dis2[201][201];
15 //int visit[201];
16 int dis[201];
17 void DJ(int n,node num[])
18 {
19 int temp;
20 float min;
21 for(int i=2;i<=n;i++)
22 {min=999999.0;
23 for(int j=1;j<=n;j++)
24 {
25
26 if(!num[j].visit&&dis2[j][1]<min)
27 {
28 temp=j;min=dis2[j][1];
29
30 }
31 }
32 //printf("temp=%d min=%.3f \n",temp,min);
33 num[temp].visit=true;
34 for(int j=1;j<=n;j++){
35 if(!num[j].visit&&dis2[j][temp]<dis2[j][1])
36 dis2[j][1]=MIN(dis2[j][1],MAX(dis2[temp][1],dis2[j][temp]));
37 }
38 }
39
40 }
41 int main()
42 {
43 int n;
44 int count=0;
45 while(scanf("%d",&n)!=EOF&&n)
46 {
47 node num[201];
48 //memset(visit,0,sizeof(visit));
49 //memset(dis2,999999.0,sizeof(dis2));
50 for(int i=1;i<=n;i++){
51 scanf("%d%d",&num[i].x,&num[i].y);
52 num[i].visit=false;
53 num[1].visit=true;
54 }
55 for(int i=1;i<=n;i++)
56 for(int j=1;j<=n;j++){
57 dis2[i][j]=ndis(num[i],num[j]);
58 }
59 //for(int i=1;i<=n;i++)
60 //for(int j=1;j<=n;j++)printf("%.3f ",dis2[i][j]);
61 DJ(n,num);
62 printf("Scenario #%d\nFrog Distance = %.3f\n\n",++count,dis2[2][1]);
63 }
64 return 0;
65 }
第二种是Floy算法,最容易理解,代码还少
#include<stdio.h>
#include<math.h>
#define max 200
#define MIN(a,b) ((a)<(b)?(a):(b))
#define MAX(a,b) ((a)>(b)?(a):(b))
double D[max][max], s[max];
struct N{ double x, y;}N[max];
int main(){
int n, i, j, k, h = 0;
while (scanf("%d", &n), n)
{
for (i = 0;i < n; i++)
{
scanf("%lf %lf", &N[i].x, &N[i].y);
}
for (i = 0; i < n; i++)
{ for (j = 0; j < n; j++)
{
if (i != j) //将每两点之间的距离打表
D[i][j] = sqrt((N[i].x - N[j].x) * (N[i].x - N[j].x) + (N[i].y - N[j].y) * (N[i].y - N[j].y));
}
} //Floyd算法
for (k = 0; k < n; k++)
{
for (i = 0; i < n; i++)
{ if (k != i)
{
for (j = 0; j < n; j++)
{
if (j != k)
{ D[i][j] = MIN(D[i][j], MAX(D[i][k], D[k][j]));
}
}
}
}
}
h++;
printf("Scenario #%d\n", h);
printf("Frog Distance = %.3f\n\n", D[0][1]);}
return 0;
}