题目链接
题意
Freddy所在石头编号为1,Fiona 所在石头编号为2。给出V个石头的坐标,任意两个石头间的距离即其直线距离。求从1石头到2石头所有路径的最长边的最小值。
思路
更改Dijkstra的更新方式。注意输出格式最后一行没回车。以及,POJ输出double用%f。。。。
代码
#include <iostream>
#include <vector>
#include <queue>
#include<cmath>
#include <string.h>
using namespace std;
const int MAXN=1000;
const int INF=0xfffffff;
double mmap[MAXN][MAXN];
struct Node
{
int x;
int y;
} node[300];
int V;
bool vis[MAXN];
double d[MAXN];
double sq(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()
{
memset(vis,0,sizeof vis);
for(int i=1;i<=V;i++) d[i]=(i==1)?0:INF;
for(int i=1;i<=V;i++)
{
int x,m=INF;
for(int y=1;y<=V;y++)
{
if(!vis[y]&&d[y]<=m)
{
x=y;
m=d[x];
}
}
vis[x]=1;
for(int y=1;y<=V;y++) d[y]=min(d[y],max(d[x],mmap[x][y]));
}
}
int main()
{
//cout<<INF<<endl;
//freopen("out.txt","w",stdout);
int kase=0;
while(~scanf("%d",&V)&&V)
{
memset(mmap,0,sizeof mmap);
memset(d,0,sizeof d);
for(int i=1; i<=V; i++)
{
scanf("%d %d",&node[i].x,&node[i].y);
}
for(int i=1; i<=V; i++)
for(int j=i; j<=V; j++)
{
mmap[i][j]=mmap[j][i]=sq(node[i],node[j]);
}
dijkstra();
if(kase) printf("\n");
printf("Scenario #%d\nFrog Distance = %.3f\n",++kase,d[2]);
}
return 0;
}