• poj 2253 (dijkstra 变形)


    http://poj.org/problem?id=2253

    一个池塘中分布着n块可供青蛙跳跃的石头,坐标分别为sto[i].x和sto[i].y,给出Freddy和Fiona站的石头,
    问Freddy想借助这些石头,跳去Fiona那,它的跳跃距离至少是多少?
    
    
    最短路的变形啊 松弛方程 dis[j]=max(dis[k],map[k][j]);

    为什么松弛方程是上面那样呢?》首先我们回忆一下如果dis[j]>dis[k]+map[k][j]
    ,则更新其值是丛原点到j点的最短距离,那么在此
    dis[j]=max(dis[k],map[k][j])表示借助中间点跳的话,要跳的j点,则在路径中最长粗条dia[j];

     #include<stdio.h> #define max 999999 #define N 250 #include<math.h> double dis[N],min,ans,map[N][N]; int vis[N],n; struct node { int x; int y; }p[N]; double max1(double a,double b) { return a>b?a:b; } void init() { int i,j; for(i=0;i<=n;i++) { dis[i]=max; vis[i]=0; for(j=0;j<=n;j++)map[i][j]=max; } ans=0; } void search(int x) { int i,j,k,min; vis[x]=1; for(i=0;i<n;i++) { dis[i]=map[x][i]; } dis[x]=0; for(i=1;i<n;i++) { min=max; for(j=0;j<n;j++) { if(min>dis[j]&&vis[j]==0) { min=dis[j]; k=j; } } vis[k]=1; for(j=0;j<n;j++)//松弛方程 { if(map[k][j]!=max&&!vis[j]&&dis[j]>max1(dis[k],map[k][j])) dis[j]=max1(dis[k],map[k][j]); } } } int main() { int l=0,i,j; while(scanf("%d",&n),n) { l++; init(); for(i=0;i<n;i++) { scanf("%d%d",&p[i].x,&p[i].y); } for(i=0;i<n-1;i++) { for(j=i+1;j<n;j++) { double a=(p[i].x-p[j].x)*(p[i].x-p[j].x)*1.0; double b=(p[i].y-p[j].y)*(p[i].y-p[j].y)*1.0; map[j][i]= map[i][j]=sqrt(a+b); } } search(0); printf("Scenario #%d\n",l); printf("Frog Distance = %.3f\n\n",dis[1]); } }
  • 相关阅读:
    软件git装的过程
    深入理解多态
    深入.net框架
    深入C#数据类型
    JavaScript 性能优化(2)
    JAVA: 集合框架
    JavaScript 性能优化(1)
    JavaScript 常用进度条
    Java: 随机生成字符串并排序
    JAVA: String详解
  • 原文地址:https://www.cnblogs.com/acSzz/p/2376260.html
Copyright © 2020-2023  润新知