zoukankan      html  css  js  c++  java
  • 「日常训练」「小专题·图论」 Frogger (1-1)

    题意

    分析

    变形的dijkstra。
    分析题意之后补充。

    代码

    // Origin:
    // Theme: Graph Theory (Basic)
    // Date: 080518
    // Author: Sam X
    
    //#include <bits/stdc++.h>
    #include <iostream>
    #include <utility>
    #include <iomanip>
    #include <cstring>
    #include <cmath>
    #define MP make_pair
    #define PB push_back
    #define fi first
    #define se second
    #define ZERO(x) memset((x), 0, sizeof(x))
    #define ALL(x) (x).begin(),(x).end()
    #define rep(i, a, b) for (int i = (a); i <= (b); ++i)
    #define per(i, a, b) for (int i = (a); i >= (b); --i)
    #define QUICKIO                  
        ios::sync_with_stdio(false); 
        cin.tie(0);                  
        cout.tie(0);
    using namespace std;
    typedef long long ll;
    typedef unsigned long long ul;
    typedef pair<int,int> pi;
    typedef pair<int,pi> pii;
    
    template<typename T>
    T read()
    {
        T tmp; cin>>tmp;
        return tmp;
    }
    inline double dist(pi x,pi y) { return sqrt((x.fi-y.fi)*(x.fi-y.fi)+(x.se-y.se)*(x.se-y.se)); }
    pi pnt[205];
    double d[205][205];
    double dijkstra(int cnt,int beg)
    {
        bool vis[205]; ZERO(vis);
        double tmpd[205];
        memset(tmpd,0x43,sizeof(tmpd)); // INF
        tmpd[beg]=0;
        rep(i,1,cnt)
        {
            //cout<<endl<<"***"<<endl;
            //rep(i,1,cnt) cout<<tmpd[i]<<" "; cout<<endl;
            int minx=-1;double minv=tmpd[0];
            rep(j,1,cnt) if(!vis[j] && minv-tmpd[j]>1e-8) minv=tmpd[minx=j];
            if(minx==-1) break;
            vis[minx]=true;
            rep(j,1,cnt) if(!vis[j])
            {
                tmpd[j]=min(tmpd[j],max(tmpd[minx],d[minx][j]));
            }
        }
        return tmpd[2];
    }
    int main()
    {
        int n,kase=0;
        while(cin>>n)
        {
            if(!n) break;
            rep(i,1,n)
            {
                cin>>pnt[i].fi>>pnt[i].se;
            }
            rep(i,1,n)
            {
                rep(j,i,n)
                {
                    d[i][j]=d[j][i]=dist(pnt[i],pnt[j]);
                }
            }
            cout<<"Scenario #"<<++kase<<endl<<"Frog Distance = "<<fixed<<setprecision(3)<<dijkstra(n,1)<<endl;
            cout<<endl;
        }
        return 0;
    }

    kuangbin的代码与分析

    floyed的算法本身就带有dp的色彩在里面,所以我们可以从这个角度出发分析。

    //============================================================================
    // Name        : POJ.cpp
    // Author      : 
    // Version     :
    // Copyright   : Your copyright notice
    // Description : Hello World in C++, Ansi-style
    //============================================================================
    
    #include <iostream>
    #include <string.h>
    #include <stdio.h>
    #include <algorithm>
    #include <set>
    #include <queue>
    #include <map>
    #include <vector>
    #include <string>
    #include <math.h>
    using namespace std;
    const int MAXN=210;
    
    pair<int,int>p[MAXN];
    
    double dis(pair<int,int>p1,pair<int,int>p2)
    {
        return sqrt((double)(p1.first-p2.first)*(p1.first-p2.first)+(p2.second-p1.second)*(p2.second-p1.second));
    }
    double dist[MAXN][MAXN];
    int main()
    {
    //    freopen("in.txt","r",stdin);
    //    freopen("out.txt","w",stdout);
        int n;
        int x,y;
        int iCase=0;
        while(scanf("%d",&n)==1&&n)
        {
            iCase++;
            printf("Scenario #%d
    ",iCase);
            for(int i=0;i<n;i++)
            {
                scanf("%d%d",&x,&y);
                p[i]=make_pair(x,y);
            }
            for(int i=0;i<n;i++)
                for(int j=i;j<n;j++)
                {
                    if(i==j)dist[i][j]=dis(p[i],p[j]);
                    else dist[j][i]=dist[i][j]=dis(p[i],p[j]);
                }
            for(int k=0;k<n;k++)
                for(int i=0;i<n;i++)
                    for(int j=0;j<n;j++)
                        if(dist[i][j]>max(dist[i][k],dist[k][j]))
                            dist[i][j]=max(dist[i][k],dist[k][j]);
            printf("Frog Distance = %.3f
    
    ",dist[0][1]);
        }
        return 0;
    }
    如非注明,原创内容遵循GFDLv1.3发布;其中的代码遵循GPLv3发布。
  • 相关阅读:
    OData – 权限管理
    Identity – Authorize Custom Authorization Policy Providers
    CSS – W3Schools 学习笔记 (1)
    OData – How It Work
    OData – Custom Serialize & Deserialize
    ASP.NET Core – System.Text.Json
    Identity – Authorize
    ASP.NET Core – Custom Input formatters For Partial Update and Handle Underposting
    as3 Matrix用法
    as3页游聊天框点击透明区域及普通文本支持寻路方案
  • 原文地址:https://www.cnblogs.com/samhx/p/9652055.html
Copyright © 2011-2022 走看看