首页 > 代码库 > shortpath2253

shortpath2253

 

Freddy Frog暗恋Fiona Frog,在他们之间有n快石头,告诉你这n快石头的坐标,第一快为Freddy Frog的坐标,第n块为Finoa Frog的坐标,Freddy可以借助石头经过任何路径到达Fiona那里,问他最小的弹跳距离是多少

 

1797一样,只不过这里求的是所有 路径里最大边 中最小的那个

因此第一步取最小的那个。后面如果有更大的边,则需要松弛,因为路径上有更大的边,因此需要更新该路径的最大边。

 

当然用FOLYD算法也可以 后面也有:

 

#include<stdio.h>

 

#include<string.h>

#include<math.h>

const int MAXN=300;

const int INF=0x7fffffff;

int map[MAXN][MAXN];

int dist[MAXN];

int n;

struct Point

{

    int x,y;

}pnt[MAXN];

int max(int a,int b)

{

    return a>b?a:b;

}

int min(int a,int b)

{

    return a<b?a:b;

}

int _dist(Point a,Point b)

{

    return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);

}

void Dijkstra()

{

   int i,j,k;

   int min;

   int p[MAXN];

   for (i=1;i<=n;i++)

   {

       p[i]=0;

       dist[i]=map[1][i];//1是源点,具体的源点不同

   }

   dist[1]=0;

   p[1]=1;

   for (i=1;i<=n-1;i++)

   {

       min=INF;

       k=0;

       for (j=1;j<=n;j++)

       {

           if(!p[j] && dist[j]<min)

           {

               min=dist[j];

               k=j;

           }

       }

       if(k==0) return ;

       p[k]=1;

       for (j=1;j<=n;j++)

       {

           if(!p[j] && map[k][j]!=INF)

           {

               if(dist[j]>max(dist[k],map[k][j]))

               dist[j]=max(dist[k],map[k][j]);

           }

       }

   }

}

int main()

{

    int cas=1,i,j;

    while(scanf("%d",&n) && n)

    {

        for (i=1;i<=n;i++)

        {

            scanf("%d%d",&pnt[i].x,&pnt[i].y);

        }

        for (i=1;i<=n;i++)

            for (j=1;j<=n;j++)

            {

                if(i==j) map[i][j]=0; 

                else map[i][j]=INF;

            }

        for (i=1;i<=n;i++)

        {

            for (j=1;j<=n;j++)

            {

                    map[i][j]=_dist(pnt[i],pnt[j]);

            }

        }

        Dijkstra();

        printf("Scenario #%d\n",cas++);

        printf("Frog Distance = %.3f\n\n",sqrt(1.0*dist[2]));//在计算距离时一直没有开方,因此这里需要开方

    }

    return 0;

}

 

 

当然用FOLYD算法也可以 后面也有:

//Memory Time 

//584K   63MS 

 

#include<iostream>

#include<math.h>

#include<iomanip>

using namespace std;

 

class coordinate

{

public:

double x,y;

}point[201];

 

double path[201][201];   //两点间的权值

 

int main(void)

{

int i,j,k;

 

int cases=1;

while(cases)

{

/*Read in*/

 

int n;   //numbers of stones;

cin>>n;

if(!n)break;

 

for(i=1;i<=n;i++)

cin>>point[i].x>>point[i].y;

 

/*Compute the weights of any two points*/

 

for(i=1;i<=n-1;i++)

for(j=i+1;j<=n;j++)

{

double x2=point[i].x-point[j].x;

double y2=point[i].y-point[j].y;

path[i][j]=path[j][i]=sqrt(x2*x2+y2*y2);  //双向性

}

 

/*Floyd Algorithm*/

 

for(k=1;k<=n;k++)    //k点是第3

for(i=1;i<=n-1;i++)    //主要针对由ij的松弛,最终任意两点间的权值都会被分别松弛为最大跳的最小(但每个两点的最小不一定相同)ii不需要计算

for(j=i+1;j<=n;j++)

if(path[i][k]<path[i][j] && path[k][j]<path[i][j])    //当边ik,kj的权值都小于ij时,则走i->k->j路线,否则走i->j路线

if(path[i][k]<path[k][j])               //当走i->k->j路线时,选择max{ik,kj},只有选择最大跳才能保证连通

path[i][j]=path[j][i]=path[k][j];

else

path[i][j]=path[j][i]=path[i][k];

 

cout<<"Scenario #"<<cases++<<endl;

cout<<fixed<<setprecision(3)<<"Frog Distance = "<<path[1][2]<<endl;

//fixed用固定的小数点位数来显示浮点数(包括小数位全为0)

//setprecision(3)设置小数位数为3

cout<<endl;

}

return 0;

}