• POJ2502乘坐地铁上学


    POJ2502

    题目大意:给你一个二维地图,起点终点,以及多条地铁线路(只有相邻两站才可互通)中的站点坐标。步行以及坐地铁的速度;

    思路:难点在于建图,一个多小时磨磨蹭蹭,都是因为思路没捋清楚~~,对于每一条地铁线,在输入站点坐标的过程中我们就可以建立图像了;输入完成后,遍历所有的点再建立,以步行为计量单位的图像。就ok啦,然后裸spfa就好了

    #include <iostream>
    #include <vector>
    #include <string.h>
    #include <algorithm>
    #include <cmath>
    #include <queue>
    #define inf 0x3f3f3f3f
    using namespace std;
    const int maxn = 2e5 + 2e2;
    struct Point
    {
        double x,y;
        Point (double x = 0.0,double y = 0.0):x(x),y(y){}
    }ps[maxn];
    struct node
    {
        int to,pre;
        double v;
    }edge[maxn];
    double d[maxn];
    int vis[maxn];
    int id[maxn];
    int cnt;
    int nump;
    void init()
    {
        memset(vis,0 ,sizeof(vis));
        memset(id,-1,sizeof(id));
        cnt = 0;
        nump = 2;
    }
    void add(int from,int to,double v)
    {
        edge[cnt].to = to;
        edge[cnt].v = v;
        edge[cnt].pre = id[from];
        id[from] = cnt++;
    }
    
    double disget(int i,int j)
    {
        return sqrt((ps[i].x - ps[j].x) * (ps[i].x - ps[j].x) +
                    (ps[i].y - ps[j].y) * (ps[i].y - ps[j].y));
    }
    queue<int>q;
    void spfa(int s)
    {
        q.push(s);
        vis[s] = 1;
        d[s] = 0;
        while(q.size())
        {
            int now = q.front();q.pop();
            vis[now] = 0;
            for(int i = id[now];~i;i = edge[i].pre)
            {
                if(d[edge[i].to] > d[now] + edge[i].v)
                {
                    d[edge[i].to] = d[now] + edge[i].v;
                    if(!vis[edge[i].to])
                    {
                        vis[edge[i].to] = 1;
                        q.push(edge[i].to);
                    }
                }
            }
        }
    }
    int main()
    {
        init();
        double x,y;
        scanf("%lf%lf",&x,&y);
        ps[0]=Point(x,y);
        scanf("%lf%lf",&x,&y);
        ps[1] = Point(x,y);
        d[1] = inf;
        while(~scanf("%lf%lf",&x,&y))
        {
            ps[nump] = Point(x,y);
            d[nump++] = inf;
            while(~scanf("%lf%lf",&x,&y) && x != -1 && y != -1)
            {
                ps[nump] = Point(x,y);
                double v = disget(nump,nump-1) / (1000.0 * 40.0) * 60.0;
                //cout<<v<<endl;
                add(nump - 1,nump,v);
                add(nump,nump - 1,v);
                d[nump++] = inf;
            }
        }
        for(int i = 0;i < nump;i++)
        {
            for(int j = 0;j < nump;j++)
            {
                double v = disget(i,j) / (1000 * 10) * 60;
                //cout<<v<<endl;
                add(i,j,v);
            }
        }
        spfa(0);
        printf("%d
    ",int(d[1] + 0.5));
        return 0;
    }
    
  • 相关阅读:
    A.4.2虚函数 virtual 和多态的实现
    A.51,集合类 ArrayList。2,对字符串的处理(String)
    A.4.1类的继承(implement)
    Android ExpandableListView的使用
    Android 使用SAX解析XML
    [转]Android 内存监测工具 DDMS > Heap .
    Android中 ExpandableList的使用2
    Android 横屏竖屏的切换
    Android 文件操作
    Android Preference的使用总结(很全很详细)以及SharedPreferences多个程序之间共享数据
  • 原文地址:https://www.cnblogs.com/DF-yimeng/p/8549450.html
Copyright © 2020-2023  润新知