zoukankan      html  css  js  c++  java
  • P1522 牛的旅行

    洛谷

    此题。
    调了2+小时。。
    终其原因:
    1、pow1(x) (x)*(x) !
    2、memset(127) 可能比 1e10 小

    exin 至极 , 铭记!

    #include<iostream>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<queue>
    #include<vector>
    #include<cstdio>
    #include<cmath>
    #define pow1(x) (x)*(x) 
    #define maxint 1e10
    using namespace std;
    int n;
    double dis[151][151],mdis[151],zx[151],zy[151];
    int main()
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            int x,y;
            scanf("%d%d",&x,&y);
            zx[i]=x,zy[i]=y;
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                char c;
                cin>>c;
                if(c=='1')
                {
                    dis[i][j]=sqrt(pow1(zx[i]-zx[j])+pow1(zy[i]-zy[j]));
                }
                else dis[i][j]=maxint;//初始化 
            }
        }
        for(int k=1;k<=n;k++)//floyed 
        {
            for(int i=1;i<=n;i++)
            {
                for(int j=1;j<=n;j++)
                {
                    if(i!=j&&i!=k&&j!=k)
                     if(dis[i][k]<maxint-1&&dis[k][j]<maxint-1)//如果大于maxint ,则两个点不连通 ,即在两个牧场内 
                    dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
                }
            }
        }
    
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            if(i!=j&&dis[i][j]<maxint-1)
            {
                mdis[i]=max(dis[i][j],mdis[i]);//求每个点到其他点距离 的最大值 
            }
        }
    
        double len1=0;
        for(int i=1;i<=n;i++)
         if(mdis[i]>len1) len1=mdis[i];//len1 为两个牧场的大的那个直径  
    
        double len2=1e20;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(i!=j&&dis[i][j]>maxint-1)
                {
                    len2=min(mdis[i]+mdis[j]+sqrt(pow1(zx[i]-zx[j])+pow1(zy[i]-zy[j])),len2);
                }
            }
        }
        double ans;
        ans=max(len1,len2);//连接后两个最小直径 与 一个牧场的直径取最大值 (为防止牧场套牧场的情况)  
        printf("%.6lf",ans);
        return 0;
    } 
  • 相关阅读:
    React+Redux仿Web追书神器
    关于贝塞尔曲线的故事
    420小时学习代码之后:如何教你免费自学Python
    学问Chat UI(3)
    学问Chat UI(1)
    Binder进程间通信详解
    Handler源码分析
    学问Chat UI(4)
    WebPack错误集
    React问题集序
  • 原文地址:https://www.cnblogs.com/dfsac/p/6819759.html
Copyright © 2011-2022 走看看