题意:求1点到2点的所有能够到2点的所有通路里的的最大路径(这里的路径特指两点之间的线段)的最小值。
这题对我来说收获颇丰,我们可以修改dijkstra里面的松弛函数,使得其变为求每个点的满足条件的值,并用dist数组来记录。详见代码。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
#define INF 0x3f3f3f3f
#define INF2 -0x3f3f3f3f
typedef struct Node
{
double x;
double y;
};
Node nodes[205*2];
typedef struct Egde
{
int l;
int r;
double value;
};
double a[205*2][205*2];
double dist[205*2];
bool visited[205*2];
int n,sx,sy,ex,ey;
double Max;
void dijkstra()
{
visited[1]=true;
for(int i=1; i<=n; i++)
{
dist[i]=a[1][i];
}
for(int i=1; i<=n; i++)
{
int Min=INF,node=0;
for(int j=1; j<=n; j++)
{
if(!visited[j]&&Min>dist[j])
{
Min=dist[j];
node=j;
}
}
if(node==0)
return;
visited[node]=true;
for(int j=1; j<=n; j++)
{
Max=max(dist[node],a[node][j]);//构成dist[node]和a[node][j]里找最大的边,因为这两条边来构成一条新的dist[j]
//用为要去最大边里的最小边,那么我们就要把它和原来的dist[j]进行比较
//再把较小的边赋给dist[j]来成为新的dist[j]以便进行下次更新 dist[j]=min(dist[j],Max);
dist[j]=min(dist[j],Max);
}
}
}
int main()
{
int sym=0;
while(scanf("%d",&n)&&n!=0)
{
sym++;
memset(nodes,0,sizeof(nodes));
memset(a,0x3f,sizeof(a));
memset(dist,0x3f,sizeof(dist));
memset(visited,false,sizeof(visited));
for(int i=1; i<=n; i++)
{
scanf("%lf%lf",&nodes[i].x,&nodes[i].y);
}
for(int i=1; i<=n; i++)
{
for(int j=i+1; j<=n; j++)
{
double d=sqrt((nodes[i].x-nodes[j].x)*(nodes[i].x-nodes[j].x)+(nodes[i].y-nodes[j].y)*(nodes[i].y-nodes[j].y));
a[i][j]=a[j][i]=d;
a[i][i]=0;
}
}
Max=INF;
dijkstra();
printf("Scenario #%d\n",sym);
printf("Frog Distance = %.3f\n\n",dist[2]);
}
return 0;
}