void-man

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

给出几个坐标,要求从第一个坐标到第二个坐标的路径中最大跳跃距离的最小值

求单源最短路径问题,首先想到用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;
}
posted on 2011-04-18 23:51  void-man  阅读(313)  评论(0编辑  收藏  举报