kuangbin专题四 B题 Frogger(POJ2253)
题目链接 : http://poj.org/problem?id=2253
题意:每组数据第一行给一个 n (表示下面有 n 个点)
然后输入 n 个点的坐标 ,问从青蛙位置 1 到青蛙位置 2 路径上最大的通道权值
dijkstra
#include <iostream> #include <algorithm> #include <cstring> #include <cmath> using namespace std ; #define maxn 1100 #define INF 99999999 int n ; double map[maxn][maxn] ; bool visit[maxn] ; double dis[maxn] ; double x[maxn] , y[maxn] ; void Dijkstra() { memset(visit , false , sizeof(visit)) ; for(int i = 1 ; i <= n ; i++){ dis[i] = map[1][i] ; } visit[1] = true ; for(int i = 2 ; i <= n ; i++){ double min_num = INF * 1.0 ; int v ; for(int j = 1 ; j <= n ; j++){ if(!visit[j] && dis[j] < min_num){ min_num = dis[j] ; v = j ; } } visit[v] = true ; // 保存路径上最大权值通道的权值 for(int j = 1 ; j <= n ; j++){ if(!visit[j] && dis[j] > max(dis[v] , map[v][j])){ dis[j] = max(dis[v] , map[v][j]) ; } } } return; } int main() { int Case = 0 ; while(cin >> n && n ){ for(int i = 1 ; i <= n ; i++){ cin >> x[i] >> y[i] ; } for(int i = 1 ; i <= n ; i++){ for(int j = 1 ; j <= n ; j++){ map[i][j] = sqrt((x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j])) ; } } Dijkstra() ; printf("Scenario #%d\n" , ++Case) ; printf("Frog Distance = %.3f\n\n" , dis[2]) ; } return 0 ; }
floyd算法 核心代码 :
for(int k=1; k<=n; k++) for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) { if(map1[i][j]>map1[i][k]+map1[k][j]) map1[i][j]=map1[i][k]+map1[k][j]; }
这种算法可以找多源最短路,想知道 a 到 b 点的最短路,只能加入中间点来缩短路径,
AC代码:注意输出格式
#include <cstdio> #include <cmath> #include <iostream> #include <algorithm> using namespace std ; #define maxn 300 int n ; double map[maxn][maxn] ; int dx[maxn] , dy[maxn] ; int main(){ //freopen("1.txt" , "r" , stdin) ; int times = 0 ; while(~scanf("%d" , &n)){ if(n==0) break ; for(int i=0 ; i<n ; i++){ scanf("%d%d" , &dx[i] , &dy[i]) ; } //坐标计算距离 for(int i=0 ; i<n ; i++){ for(int j=0 ; j<n ; j++){ map[i][j] = map[j][i] = (double)sqrt(0.0+(dx[i]-dx[j])*(dx[i]-dx[j]) + (dy[i]-dy[j])*(dy[i]-dy[j])) ; } } // floyd算法 for(int k=0 ; k<n ; k++){ for(int i=0 ; i<n ; i++){ for(int j=0 ; j<n ; j++){ if(map[i][j] > max(map[i][k] , map[k][j])) {//由floyd算法改了一下判断条件 map[i][j] = max(map[i][k] , map[k][j]) ; } } } } printf("Scenario #%d\n" , ++times) ; printf("Frog Distance = %.3f\n\n" , map[0][1]) ; } return 0 ; }