• poj 2253 二分/最短路


    题意:

    A青蛙要去B青蛙所在的石头,湖面上共有n个石头,A在0,B在1,A到B可以跳到其它石头上,要求到B的路程中,跳的最远的一次?使这个最大距离最小。

    分析:

    虽然在最短路的题目里看到这个题,不过读完题我就想到了二分答案+并查集判联通,二分最大距离,然后把不大于这个距离的边的两点放到一个集合里,最后判断一下A和B是否在同一个集合即可。很快敲完了,交上去WA了,怎么可能WA呢?百思不得其解,又试了几发,还是WA。。最后无奈搜题解了,md,把lf改成f就过了。。。。

    如果用最短路做也很容易,就是把最短距离d[i],看做0到i点经过的路径中最大的一条边,最短路就是维护这条最大边最小即可。

    二分 n^2(logN) 16ms

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    #include<stack>
    #include<map>
    #include<vector>
    #include<queue>
    using namespace std;
    const int N=200+9;
    int fa[N];
    int d[N][N];
    int findfa(int x){return fa[x]==x?x:fa[x]=findfa(fa[x]);}
    int n;
    bool ok(int mx)
    {
        for(int i=0;i<n;i++)fa[i]=i;
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                if(d[i][j]<=mx){
                    int xx=findfa(i),yy=findfa(j);
                    if(xx!=yy)fa[xx]=yy;
                }
            }
        }
        return findfa(0)==findfa(1);
    }
    int x[N],y[N];
    int main()
    {
        int cas=0;
        while(~scanf("%d",&n)&&n){
            for(int i=0;i<n;i++){
                scanf("%d%d",&x[i],&y[i]);
            }
            vector<int>vec;
            for(int i=0;i<n;i++)
                for(int j=0;j<n;j++)
                    vec.push_back(d[i][j]=(x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
            sort(vec.begin(),vec.end());
            int len=unique(vec.begin(),vec.end())-vec.begin();
            int l=0,r=len-1;
            while(l<r){
                int m=l+(r-l)/2;
                if(ok(vec[m]))r=m;
                else l=m+1;
            }
            printf("Scenario #%d
    Frog Distance = %.3f
    
    ",++cas,sqrt((double)vec[l]));
        }
        return 0;
    }

    dijkstra n^2  0ms
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    #include<stack>
    #include<map>
    #include<vector>
    #include<queue>
    using namespace std;
    const int INF=0x3f3f3f3f;
    const int N=200+9;
    bool vis[N];
    int d[N][N];
    int dis[N];
    int n;
    int dij()
    {
        memset(vis,0,sizeof(vis));
        for(int i=0;i<n;i++)dis[i]=d[0][i];
        for(int i=0;i<n;i++){
            int x,m=INF;
            for(int y=0;y<n;y++)if(!vis[y]&&dis[y]<=m)m=dis[x=y];
            vis[x]=1;
            for(int y=0;y<n;y++)if(!vis[y])
                dis[y]=min(dis[y],max(dis[x],d[x][y]));
        }
        return dis[1];
    }
    int x[N],y[N];
    int main()
    {
        int cas=0;
        while(~scanf("%d",&n)&&n){
            for(int i=0;i<n;i++){
                scanf("%d%d",&x[i],&y[i]);
            }
            for(int i=0;i<n;i++)
                for(int j=0;j<n;j++)
                    d[i][j]=(x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]);
            printf("Scenario #%d
    Frog Distance = %.3f
    
    ",++cas,sqrt((double)dij()));
        }
        return 0;
    }



  • 相关阅读:
    【洛谷P3374】【模板】树状数组 1
    【vijos1460】拉力赛
    NOIp2013货车运输
    【codevs1519】过路费
    【codevs1036】商务旅行
    【codevs2370】小机房的树
    【洛谷P3398】仓鼠找sugar
    【洛谷P2912】[USACO08OCT]牧场散步Pasture Walking
    sql语句绑定方法
    单实例asm,修改主机名和ip地址后的重配置+集群重新配置GI
  • 原文地址:https://www.cnblogs.com/01world/p/5651194.html
Copyright © 2020-2023  润新知