#include

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 ; 
}

 

   

posted @ 2017-09-26 11:17  0一叶0知秋0  阅读(163)  评论(0编辑  收藏  举报