UVa10816 - Travel in Desert(二分+dijkstra)

题目链接

简介

分析:
二分+dijkstra最短路

二分最高温度
每次用dij判断
对于本题的数据范围是完全可以接受的

tip

晚上有点累了,所以码码的速度下降了,也很容易出错
码码的时候一定要注意,

不要手残

注意精度问题
一开始我的上下边界选择的是输入中的最低温度和最高温度,结果狂WA不止
题目说温度在20~50之间
但是我在对拍的时候,发现标称的输出有19.9
于是我就把上下边界改成了

19.9~50.1

于是就A了

又被歪国人摆了一道

//这里写代码片
#include
#include
#include
#include
#include
#include
#include

using namespace std;

const double INF=1e9;
const double eps=1e-6;
int n,m,s,t,pre[105];

inline int dcmp(double x)
{
    if (fabs(x)return 0;
    else if (x>0) return 1;
    else return -1;
}

struct heapnode{
    int u;
    double d;
    bool operator < (const heapnode &a)const
    {
        return dcmp(d-a.d)>0;
    }
};

struct node{
    int x,y;
    double tem,v;
};

struct dijkstra{
    int n,m;
    vector e;
    vector<int> G[105];
    bool p[105];
    int pre[105];
    double dis[105];

    void init(int n)
    {
        this->n=n;
        for (int i=1;i<=n;i++) G[i].clear();
        e.clear();
    }

    void add(int u,int w,double tem,double z)
    {
        e.push_back((node){u,w,tem,z});
        m=e.size();
        G[u].push_back(m-1);
    }

    void dij(double mid)
    {
        memset(p,1,sizeof(p));
        for (int i=1;i<=n;i++) dis[i]=1e9;
        memset(pre,0,sizeof(pre));

        priority_queue Q;
        Q.push((heapnode){s,0});
        dis[s]=0;

        while (!Q.empty())
        {
            heapnode now=Q.top(); Q.pop();
            int u=now.u;
            if (!p[u]) continue;

            p[u]=0;

            for (int i=0;iif (dcmp(way.tem-mid)>0) continue;
                if (dcmp(dis[way.y]-dis[u]-way.v)>0)
                {
                    dis[way.y]=dis[u]+way.v;
                    pre[way.y]=u;
                    Q.push((heapnode){way.y,dis[way.y]});
                }
            }
        }
    }
};
dijkstra A;

int pd(double mid)
{
    A.dij(mid);
    if (dcmp(A.dis[t]-INF)<0) return 1;
    else return 0;
}

int main()
{
    while (scanf("%d%d",&n,&m)!=EOF)
    {
        scanf("%d%d",&s,&t);

        A.init(n);
        for (int i=1;i<=m;i++)
        {
            int x,y;
            double z,t;
            scanf("%d%d",&x,&y);
            scanf("%lf%lf",&t,&z);
            A.add(x,y,t,z);
            A.add(y,x,t,z);
        }

        swap(s,t);
        double L=19.9,R=50.1,ans;
        while (R-L>0.01)
        {
            double mid=(L+R)/2;
            if (pd(mid))
            {
                R=mid;
                for (int i=1;i<=n;i++)
                    pre[i]=A.pre[i];
                ans=A.dis[t];
            }   
            else L=mid;
        }

        int x=t,cnt=0;
        while (x!=0)
        {
            if (cnt++) printf(" ");
            printf("%d",x);
            x=pre[x];
        }
        printf("\n");
        printf("%.1lf %.1lf\n",ans,(L+R)/2.0);
    }
    return 0;
}

你可能感兴趣的:(UVa/LA,图论,二分,dijkstra,uva)