zoukankan      html  css  js  c++  java
  • 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
    " , ++Case) ; 
            printf("Frog Distance = %.3f
    
    " , 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
    " , ++times) ; 
            printf("Frog Distance = %.3f
    
    " , map[0][1]) ; 
        }
        return 0 ; 
    }

       

  • 相关阅读:
    fiddler 抓https坑
    20171029机器学习之特征值选择
    20171028机器学习之线性回归过拟合问题的解决方案
    使用Matplotlib画对数函数
    对朴素贝叶斯的理解(python代码已经证明)
    解决Mac系统下matplotlib中文显示方块问题
    个人工作总结08(第二次冲刺)
    个人工作总结07(第二次冲刺)
    个人工作总结06(第二次冲刺)
    个人工作总结05(第二次冲刺)
  • 原文地址:https://www.cnblogs.com/yi-ye-zhi-qiu/p/7595764.html
Copyright © 2011-2022 走看看