POJ

题意:一只青蛙想从自己脚下的石头开始调到另一只青蛙的石头上,它可以直接跳,也可以借助别的空石头跳。输入的数据是每个石头的坐标(第一个是这只青蛙踩的石头的坐标,第二个是另一只青蛙踩的石头的坐标)(从一块石头到另一块石头的最大距离)

思路:虽然是最短路的专题,但是感觉也不算是完全最短路的题,应该更多的运用了生成树的东西

读题读了半天...理解能力太差..

完整代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define inf 0x3f3f3f3f
#define maxn 1100
using namespace std;
int n,vis[maxn];
double g[maxn][maxn],dist[maxn],ans;
struct node
{
    int x,y;
}p[maxn];
void dijkstra()
{
    int i,j,index;
    dist[1]=0;
    for(i=1 ;i<= n; i++)
    {
        double Min=inf;
        for(j=1;j<= n;j++)
        {
            if(vis[j]==0&&Min>=dist[j])
                Min=dist[j],index=j;
        }
        vis[index]=1;
        if(ans< dist[index] &&dist[index]!= inf)
            ans=dist[index];
        if(index==2)
            return ;
        for(j=1 ;j<= n;j++)
        {
            if(vis[j] == 0)
                dist[j]=min(dist[j],g[index][j]);
        }
    }
}
int main()
{
    int i,j,k,x,y,cnt=1;
    while(scanf("%d",&n),n)
    {
        memset(vis,0, sizeof(vis));
        memset(p,0,sizeof(p));
        for(i=0;i<=n;i++)
            dist[i]=inf;
        k=1;
        for(i=1;i<=n;i++)
        {
            scanf("%d%d",&x,&y);
            for(j=1;j<=k;j++)
            {
                double d= sqrt((x-p[j].x)*(x-p[j].x)+(y-p[j].y)*(y-p[j].y));
                g[i][j]=g[j][i]=d;
            }
            p[k].x=x,p[k].y=y,k++;
        }
        for(i=1;i<=n;i++)
            g[i][i]=0;
        ans=0;
        
        dijkstra();
        printf("Scenario #%d
Frog Distance = %.3f

",cnt++,ans);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/Tianwell/p/11284765.html