题意:
青蛙去串门,从节点一 到节点二。一共T个节点。
询问
青蛙如果从1 到2 。 利用这T个节点,每次用最小的长度跳。问这个最小的长度
思路:
第一次知道DJK可以这么写。怎么感觉这么像kruskal ,感觉带入下kruskal的感觉就有了!
#include <stdio.h>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <iostream>
#define maxn 100005
#define inf 0x3f3f3f3f
using namespace std;
struct node
{
double x,y;
}point [maxn];
int vis[maxn];
double dist[maxn];
int T;
double where(int a,int b)
{
return sqrt((point[a].x-point[b].x)*(point[a].x-point[b].x)+(point[a].y-point[b].y)*(point[a].y-point[b].y));
}
void dijkstra()
{
for(int i=1;i<=T;i++)
{
dist[i]=inf;
}
dist[1]=0;
for(int i=1;i<=T;i++)
{
double minn=inf;
int index=0;
for(int j=1;j<=T;j++)
{
if(!vis[j]&&minn>dist[j])
{
minn=dist[j];
index=j;
}
}
vis[index]=1;
if(index==2||index==0)
break;
for(int j=1;j<=T;j++)
{
double len=where(index,j);
if(!vis[j]&&dist[j]>max( dist[index],len ))
dist[j]=max(len,dist[index]);
}
}
printf("%.3lf\n\n",dist[2]);
}
int main()
{
int Case=1;
while(scanf("%d",&T)!=EOF&&T)
{
memset(point,0,sizeof(point));
memset(vis,0,sizeof(vis));
for(int i=1;i<=T;i++)
{
scanf("%lf%lf",&point[i].x,&point[i].y);
}
printf("Scenario #%d\nFrog Distance = ",Case++);
dijkstra();
}
}