修改条件的DIJKSTRA。。。这都搞了一下午。。。郁闷了。。。
松弛条件修改为:dist[i]=max(dist[minp],edge[minp][i]) (dist用来记录构成路径的最短边集合中的最长边(很绕口啊。。。公认的))
还有 要注意边界处理 先把dist[i]设置为edge[0][i]
呃。。大概就这么多。。好久不写最短路了。。缺乏练习啊。。
#include <stdio.h>
#include <string.h>
#include <math.h>
#define MAXN 210
#define inf 1000000000
struct Tpoint {
double x,y;
} point[MAXN];
double edge[MAXN][MAXN];
double dist[MAXN];
int used[MAXN];
int n;
double max(double a,double b)
{
return a>b? a:b;
}
double length(Tpoint a, Tpoint b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
void addedge(int i,int j)
{
edge[i][j]=length(point[i],point[j]);
}
void dijkstra()
{
memset(used,0,sizeof(used));
for(int i=0; i<n; i++)
dist[i]=edge[0][i];
dist[0]=0;
used[0]=1;
for(int i=0; i<n; i++) {
double min=inf;
int minp;
for(int j=0; j<n; j++) {
if(!used[j] && dist[j]<min) {
min=dist[j];
minp=j;
}
}
used[minp]=1;
if(min==inf) break;
for(int j=0; j<n; j++) {
if(!used[j] && max(dist[minp],edge[minp][j]) < dist[j]) {
dist[j] = max(dist[minp],edge[minp][j]);
}
}
}
}
int main()
{
int ppp=1;
while(scanf("%d",&n),n) {
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
edge[i][j]=inf;
for(int i=0; i<n; i++) {
scanf("%lf%lf",&point[i].x,&point[i].y);
for(int j=0; j<i; j++) {
addedge(j,i);
addedge(i,j);
}
}
//test
//for(int i=0; i<n; i++)
// for(int j=0; j<n; j++)
// if(edge[i][j]<inf)
// printf("%d %d %.0f %.0f %.0f %.0f %.3f\n",i,j,point[i].x,point[i].y,point[j].x,point[j].y,edge[i][j]);
dijkstra();
printf("Scenario #%d\nFrog Distance = %.3f\n\n",ppp++,dist[1]);
//for (int i=0; i<n; i++) {
// printf("%.3lf\n",dist[i]);
//}
}
}
浙公网安备 33010602011771号