题意比较难搞懂。实际上就是求到‘2’点的 最小的最大值。说明白点就是:从‘1’到‘2’有多条路,每一条路中肯定有一条最大的边,求的是所有路中最大边最小的那个值。
可以用dij或者spfa搞,松弛操作都一样的。也可以用弗洛伊德,都差不多。下面只贴前两个
spfa:
#include<stdio.h> #include<string.h> #include<cstring> #include<string> #include<math.h> #include<queue> #include<algorithm> #include<iostream> #include<stdlib.h> #include<cmath> #define INF 0x3f3f3f3f #define MAX 100005 using namespace std; struct node { int u,v,next; double w; }Map[MAX]; int n,vis[MAX],x[MAX],y[MAX],k,a[MAX]; double dist[MAX]; void Init() { memset(vis,0,sizeof(vis)); for(int i=0;i<MAX;i++) { a[i]=-1; dist[i]=INF; } } void Add(int u,int v,double w) { Map[k].u=u; Map[k].v=v; Map[k].w=w; Map[k].next=a[u]; a[u]=k++; } void spfa() { queue<int>Q; int start=1,i; dist[1]=0; vis[1]=1; Q.push(start); while(!Q.empty()) { start=Q.front(); Q.pop(); vis[start]=0; for(i=a[start];i!=-1;i=Map[i].next) { int v=Map[i].v; if(dist[v] > dist[start] && dist[v] > Map[i].w)//松弛操作 { dist[v]=max(dist[start],Map[i].w); if(!vis[v]) { vis[v]=1; Q.push(v); } } } } } int main() { int i,j,cas=1; while(scanf("%d",&n),n) { Init(); for(i=1;i<=n;i++) { scanf("%d%d",&x[i],&y[i]); } for(i=1;i<=n;i++) { for(j=i;j<=n;j++) { double num=sqrt((x[i]-x[j])*(x[i]-x[j])*1.0 + (y[i]-y[j])*(y[i]-y[j])*1.0); Add(i,j,num); Add(j,i,num); } } spfa(); printf("Scenario #%d ",cas++); printf("Frog Distance = %.3f ",dist[2]); } return 0; }
dij:
#include<stdio.h> #include<string.h> #include<cstring> #include<string> #include<math.h> #include<queue> #include<algorithm> #include<iostream> #include<stdlib.h> #include<cmath> #define INF 0x3f3f3f3f #define MAX 1005 using namespace std; double dist[MAX],Map[MAX][MAX]; int vis[MAX],n; double dij() { memset(vis,0,sizeof(vis)); int i,j,k,minn; for(i=2;i<=n;i++) dist[i]=Map[1][i]; vis[1]=1; for(i=1;i<n;i++) { minn=INF; for(j=1;j<=n;j++) { if(minn > dist[j] && !vis[j]) { k=j; minn=dist[j]; } } vis[k]=1; for(j=1;j<=n;j++) { if(!vis[j] && dist[j] > dist[k] && dist[j] > Map[k][j]) { dist[j]=max(dist[k],Map[k][j]); } } } return dist[2]; } int main() { int x[MAX],y[MAX],cas=1,i,j; while(scanf("%d",&n),n) { for(i=0;i<MAX;i++) for(j=0;j<MAX;j++) Map[i][j]=INF; for(i=1;i<=n;i++) { scanf("%d%d",&x[i],&y[i]); } for(i=1;i<=n;i++) { for(j=i+1;j<=n;j++) { double k=sqrt((x[i]-x[j])*(x[i]-x[j])*1.0 + (y[i]-y[j])*(y[i]-y[j])*1.0); Map[i][j]=Map[j][i]=k; } } double ans=dij(); printf("Scenario #%d ",cas++); printf("Frog Distance = %.3f ",ans); } return 0; }