您的位置:首页 > 其它

poj 2253 dijkstra

2013-12-14 20:05 363 查看
题意:一只青蛙要通过在石头间的跳跃到达一个地方 , 求跳跃宽度的最大最小值?

关键在于 , 思考出宽度和距离的相同之处

我们只需要把距离变成每天路径上的最大宽度就行 , 然后在用dijkstra求出每个点的最小宽度

代码:

#include

#include

#include

#include

using namespace std;

#define INF 0xfffffff

#define maxn 310

//#define max(x,y) (x)>(y)?(x):(y)

double grap[maxn][maxn];

int pre[maxn] ;

double dist[maxn];

int xy[maxn][2];

int n;

void init()

{

    int i ,j;

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

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

          grap[i][j] =INF*1.0 , grap[i][i] = 0.0;

}

inline double max(double x , double y)

{

    if(x> y)   returnx;

    returny;

}

void dijkstra(int u)

{

    memset(pre ,0 , sizeof(pre));

    int i ,j;

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

       dist[i] =grap[u][i];

    dist[u] =0.0; //初始化对源点

    pre[u] =1;

    int x =u;

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

    {

       double maxs= INF*1.0;

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

          if(!pre[i]&& maxs >dist[i])

             x = i , maxs= dist[i];

       pre[x] =1;

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

          if(!pre[i]&& dist[i] >max(dist[x],grap[x][i]))

             dist[i] =max(dist[x],grap[x][i]);

    }

}

int main()

{

    int gh =1;

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

    {

      init();

       int i , x ,j , y ;

       doublez;

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

       {

          scanf("%d%d" , &xy[i][0] , &xy[i][1]);

       }

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

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

          {

             x =xy[i][0]-xy[j][0] , y = xy[i][1] - xy[j][1];

             z =sqrt(x*x*1.0+y*y*1.0);

             grap[i][j] =grap[j][i] = z;

         //   
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: