用Dijkstra做的,据说还可用Floyd、Prim等做,这以后再尝试了。
开始用c++输入是16ms,改成c的输入就0ms。。。。
这样的优化,有点囧。
代码如下:
#include <iostream>
#include <cmath>
#include <iomanip>
using namespace std;
#define SIZE 205
#define INF 0x7fffffff
double dist[SIZE];
bool visit[SIZE];
int n,count;
struct Node
{
int x,y;
} nodes[SIZE];
double cal_dis( struct Node a, struct Node b )
{
return sqrt(pow(fabs(a.x-b.x+0.0),2.0)+pow(fabs(a.y-b.y+0.0),2.0));
}
void Dijkstra()
{
int i,k;
int temp,curr;
double max;
count = 0;
memset(visit,false,sizeof(visit));
for ( i = 2; i <= n; i++ )
dist[i] = cal_dis(nodes[1],nodes[i]);
dist[1] = 0;
for ( k = 1; k <= n; k++ )
{
temp = INF;
curr = 0;
for ( i = 1; i <= n; i++ )
{
if ( temp > dist[i] && !visit[i] )
{
temp = dist[i];
curr = i;
}
}
if ( curr == 0 )
break;
visit[curr] = true;
double dis;
for ( i = 1; i <= n; i++ )
{
if ( !visit[i] ){
dis = cal_dis(nodes[curr],nodes[i]);
max = (dis>dist[curr]?dis:dist[curr]);
if ( dist[i] > max )
dist[i] = max;
}
}
}
}
int main()
{
int i;
int x,y;
int cas = 0;
while ( scanf("%d",&n) && n )
{
for ( i = 1; i <= n; i++ )
{
scanf("%d%d",&x,&y);
nodes[i].x = x;
nodes[i].y = y;
}
Dijkstra();
cout << "Scenario #" << ++cas << endl;
cout << "Frog Distance = " << fixed << setprecision(3) << dist[2] << "\n\n";
}
return 0;
}