题意:
给出n个石头的坐标 x,y,求石头a(第一块石头),石头b(第二块石头)之间的最短路径下的两块石头的最短距离
(先求最短路径,再变形:求该路径下的两块石头最短距离)
解法:
dijkstra算法变形:dist[j]表示从源点到j节点的最短路径中的两块石头的最短距离,即在最后判断中 需要在
dist[j] dist[k] 和 maps[j][k]中选择最小值
注意输出格式
AC代码:
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <cstdio>
using namespace std;
double maps[210][210];
double dist[210];
int vis[210];
struct Node //记录点的坐标
{
int x,y;
}node[210];
double dis(Node a,Node b)
{
return sqrt((double)((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)));
}
void dijkstra(int n)
{
double minn;
int k;
for(int i=1;i<=n;i++)
{
dist[i]=maps[1][i];
vis[i]=0;
}
vis[1]=1;
dist[1]=0;
for(int i=1;i<=n-1;i++)
{
minn=1000000000;
k=0;
for(int j=1;j<=n;j++)
{
if(vis[j]==0&&dist[j]<minn)
{
minn=dist[j];
k=j;
}
}
vis[k]=1;
if(k==0) break;
for(int j=1;j<=n;j++)
{
if(vis[j]==0)
dist[j]=min(dist[j],max(dist[k],maps[k][j])); //最后判断的变形
}
}
}
int main()
{
int n;
int i=1;
while(cin>>n)
{
if(n==0) break;
memset(vis,0,sizeof(vis));
memset(maps,1000000000,sizeof(maps));
memset(dist,1000000000,sizeof(dist));
for(int i=1;i<=n;i++)
{
cin>>node[i].x>>node[i].y;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i!=j)
{
maps[i][j]=dis(node[i],node[j]);
maps[j][i]=maps[i][j];
}
}
maps[i][i]=0;
}
dijkstra(n);
cout<<"Scenario #"<<i<<endl;
printf("Frog Distance = %.3f\n\n",dist[2]);
i++;
}
return 0;
}