POJ2253-Frogger(最短路变形)

题目链接:传送门BiuBiuBiu~~

分析:(一开始甚至没看懂题目。。。。) 给了两只青蛙坐标,要求出一只青蛙到另一只青蛙的最短路中的最大边的距离,一开始不知道怎么处理。。看了别人发现依旧只要套上最短路的模板,然后把dis[ ] 数组改为最短路中最长边的距离就好了。。接下来就只贴spfa算法代码了,另外两种处理差不多一样。。

(对了,看了很多题解都说G++过不去。。我在vjudge和poj上都试过了发现可以过。。。原因好像是他们没用精度函数,我用了。。。究竟为啥我也不知道~~)

AC代码:

#include<iostream>
#include<cmath>
#include<cstring>
#include<queue>
#include<algorithm>
#include<iomanip>
using namespace std;
int x[205],y[205];
int n;
const int INF=100000000;
double map[205][205]; //两点间的权值
double dis[205]; //这个不代表最短距离,而代表最短路中的最长边了
bool vis[205];
void spfa(int s){
	memset(vis,false,sizeof(vis));
	for(int i=1;i<=n;i++)	dis[i]=INF;
	dis[s]=0;
	vis[s]=true;
	queue<int> que;
	que.push(s);
	while(!que.empty()){
		int now=que.front();
		que.pop();
		vis[now]=false;
		for(int i=1;i<=n;i++){
			if(max(dis[now],map[now][i])<dis[i]){	//这个地方处理注意一下
				dis[i]=max(dis[now],map[now][i]);
				if(!vis[i]){
					que.push(i);
					vis[i]=true;
				}
			}
		}	
	}
}
int main(){
	int ans=0;
	while(cin>>n&&n){
		ans++;
		for(int i=1;i<=n;i++){
			cin>>x[i]>>y[i];
		}
		for(int i=1;i<=n;i++){
			for(int j=i+1;j<=n;j++){
				map[i][j]=map[j][i]=sqrt(double(x[j]-x[i])*(x[j]-x[i])+double(y[j]-y[i])*(y[j]-y[i]));
			}
		}
		spfa(1);
		cout<<setiosflags(ios::fixed)<<setprecision(3); //保留精度
		cout<<"Scenario #"<<ans<<endl<<"Frog Distance = "<<dis[2]<<endl<<endl;
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_43556295/article/details/88192009