最短路变形,修改下
复制一下别人的题意,有两只青蛙和若干块石头,现在已知这些东西的坐标,两只青蛙A坐标和青蛙B坐标是第一个和第二个坐标,现在A青蛙想要到B青蛙那里去,并且A青蛙可以借助任意石头的跳跃,而从A到B有若干通路,问从A到B的所有通路上的最大边,比如有 有两条通路 1(4)5 (3)2 代表1到5之间的边为4, 5到2之间的边为3,那么该条通路跳跃范围(两块石头之间的最大距离)为 4, 另一条通路 1(6) 4(1) 2 ,该条通路的跳跃范围为6, 两条通路的跳跃范围分别是 4 ,6,我们要求的就是最小的那一个跳跃范围,即4,用三种方法都能解决
1.spfa(还没学哎,先占坑)
2.dijkstra(时间0s)
代码:
#include<cstdio>
#include<algorithm>
#include<string.h>
#include<string>
#include<math.h>
using namespace std;
#include<algorithm>
#include<string.h>
#include<string>
#include<math.h>
using namespace std;
const int maxn=10006;
const int inf=0x3f3f3f3f;
double dis[maxn];
double w[maxn][maxn];//两两之间的距离
int vis[maxn];
double ans=0;
int n;
const int inf=0x3f3f3f3f;
double dis[maxn];
double w[maxn][maxn];//两两之间的距离
int vis[maxn];
double ans=0;
int n;
struct node{
int x,y;
}k[maxn];
int x,y;
}k[maxn];
double fd(node a,node b){
return sqrt((a.x-b.x)*1.0*(a.x-b.x)+(a.y-b.y)*1.0*(a.y-b.y ));
}
return sqrt((a.x-b.x)*1.0*(a.x-b.x)+(a.y-b.y)*1.0*(a.y-b.y ));
}
void dijkstra(void){
memset(vis,0,sizeof(vis));
for(int i=0;i<n;i++)dis[i]=inf;//在没更新完全前,dis都是无穷大
dis[0]=0;//自己到自己的距离为0
for(int i=0;i<n;i++){
double minn=inf;
int dex=0;
for(int j=0;j<n;j++){
if(!vis[j]&&minn>=dis[j]){
minn=dis[j];
dex=j;
}
}
vis[dex]=1;
for(int j=0;j<n;j++){
dis[j]=min(dis[j],max(dis[dex],w[dex][j]));//更新,注意,更新的大为dex到终点的距离和dex到j中间的较大的
}
}
}
memset(vis,0,sizeof(vis));
for(int i=0;i<n;i++)dis[i]=inf;//在没更新完全前,dis都是无穷大
dis[0]=0;//自己到自己的距离为0
for(int i=0;i<n;i++){
double minn=inf;
int dex=0;
for(int j=0;j<n;j++){
if(!vis[j]&&minn>=dis[j]){
minn=dis[j];
dex=j;
}
}
vis[dex]=1;
for(int j=0;j<n;j++){
dis[j]=min(dis[j],max(dis[dex],w[dex][j]));//更新,注意,更新的大为dex到终点的距离和dex到j中间的较大的
}
}
}
int main(){
int ca=0;
while(~scanf("%d",&n),n){
for(int i=0;i<n;i++){
scanf("%d%d",&k[i].x,&k[i].y);
}
for(int i=0;i<n;i++){
for(int j=i;j<n;j++){
w[i][j]=w[j][i]=fd(k[i],k[j]);
}
}
dijkstra();
printf("Scenario #%d\n", ++ca);
printf("Frog Distance = %.3lf\n\n", dis[1]);
}
}
int ca=0;
while(~scanf("%d",&n),n){
for(int i=0;i<n;i++){
scanf("%d%d",&k[i].x,&k[i].y);
}
for(int i=0;i<n;i++){
for(int j=i;j<n;j++){
w[i][j]=w[j][i]=fd(k[i],k[j]);
}
}
dijkstra();
printf("Scenario #%d\n", ++ca);
printf("Frog Distance = %.3lf\n\n", dis[1]);
}
}
3.floyd(耗时较长,代码风格比较简洁)
代码:
#include<cstdio>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
int n;
const int maxn=220;
double map[maxn][maxn];
struct node{
int x,y;
}k[maxn];
const int maxn=220;
double map[maxn][maxn];
struct node{
int x,y;
}k[maxn];
void floyd(void){
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
map[i][j]=min(map[i][j],max(map[i][k],map[k][j]));//修改变形
}
}
}
}
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
map[i][j]=min(map[i][j],max(map[i][k],map[k][j]));//修改变形
}
}
}
}
int main(){
int ca=1;
while(~scanf("%d",&n),n){
memset(map,0,sizeof(map));
for(int i=1;i<=n;i++){
scanf("%d%d",&k[i].x,&k[i].y);
}
for(int i=1;i<=n;i++){
for(int j=i;j<=n;j++){
int x=k[i].x-k[j].x;
int y=k[i].y-k[j].y;
map[j][i]=map[i][j]=(double)sqrt(1.0*x*x+1.0*y*y);
}
}
floyd();
printf("Scenario #%d\nFrog Distance = %.3lf\n\n",ca++,map[1][2]);
}
}
int ca=1;
while(~scanf("%d",&n),n){
memset(map,0,sizeof(map));
for(int i=1;i<=n;i++){
scanf("%d%d",&k[i].x,&k[i].y);
}
for(int i=1;i<=n;i++){
for(int j=i;j<=n;j++){
int x=k[i].x-k[j].x;
int y=k[i].y-k[j].y;
map[j][i]=map[i][j]=(double)sqrt(1.0*x*x+1.0*y*y);
}
}
floyd();
printf("Scenario #%d\nFrog Distance = %.3lf\n\n",ca++,map[1][2]);
}
}