题意:在一个城市里,分布着若干条地铁线路,每条地铁线路有若干个站点,所有地铁的速度均为40km/h。现在你知道了出发地和终点的坐标,以及这些地铁 线路每个站点的坐标,你的步行速度为10km/h,且你到了地铁的任意一个站之后就刚好有地铁出发。问你从出发点到终点最少需要多少时间。

//////////////////////////////////////////////////////////////////////

有很多站点,给的数据只是一条条线路,所以需要先预处理数据,增加任意两点人走需要的时间。数据预先处理比较麻烦......
#include<stdio.h>
#include<vector>
#include<stack>
#include<algorithm>
#include<string.h>
#include<math.h>
using namespace std; const int maxn = 100005;
const int oo = 0xfffffff;
const double vs = 40*1000/60.0;//每分钟走多少米
const double vp = 10*1000/60.0; struct node
{
    int u, v, next;
    double c;//两点之间所需时间
}e[maxn];
struct point
{
    int x, y;
}p[1005]; int nPoint, head[1005];
double dis[1005];
bool vis[1005]; double Len(point a, point b, double v)
{
    return sqrt( (a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y) ) / v;
}
void Add(int u, int v, double len, int k)
{
    e[k].u = u;
    e[k].v = v;
    e[k].c = len;
    e[k].next = head[u];
    head[u] = k;
}
void spfa()
{
    stack<int> sta;
    sta.push(1);     while(sta.size())
    {
        int i = sta.top();sta.pop();
        vis[i] = false;         for(int j=head[i]; j!=0; j=e[j].next)
        {
            int u = e[j].u, v = e[j].v;
            double c = e[j].c;             if(dis[u]+c < dis[v])
            {
                dis[v] = dis[u] + c;
                if(vis[v] == false)
                {
                    vis[v] = true;
                    sta.push(v);
                }
            }
        }
    }
} int main()
{
    int i, j, flag=0, k=1;     scanf("%d%d%d%d", &p[1].x, &p[1].y, &p[2].x, &p[2].y);     nPoint = 3;
    while(scanf("%d%d", &p[nPoint].x, &p[nPoint].y) != EOF)
    {
        if(p[nPoint].x != -1)
        {
            if(flag == 0)
                flag = 1;
            else
            {
                double c = Len(p[nPoint], p[nPoint-1], vs);
                Add(nPoint, nPoint-1, c, k++);
                Add(nPoint-1, nPoint, c, k++);
            }             nPoint++;
        }
        else
            flag = 0;
    }     for(i=1; i<nPoint; i++)
    for(j=i+1; j<=nPoint; j++)
    {
        double c = Len(p[i], p[j], vp);
        Add(i, j, c, k++);
        Add(j, i, c, k++);
    }     for(i=2; i<nPoint; i++)
        dis[i] = oo;     spfa();     printf("%.0f\n", dis[2]);     return 0;
}

L - Subway - POJ 2502的更多相关文章

  1. Subway POJ 2502

    题目链接: http://poj.org/problem?id=2502 题目大意: 你刚从一个安静的小镇搬到一个吵闹的大城市,所以你不能再骑自行车去上学了,只能乘坐地铁或者步行去上学.因为你不想迟到 ...

  2. Subway POJ - 2502 spfa

    #include<cstdio> #include<cmath> #include<cstring> #include<cstring> #includ ...

  3. Subway POJ - 2502 最短路

    题意:给出地铁线  起点和 终点  坐地铁速度为v2  走路为v1 求起点到终点的最短距离  (答案需要四舍五入这里坑了好久) 拿给出的地铁站点 和起点终点建边即可  然后跑个迪杰斯特拉 #inclu ...

  4. POJ 2502 Subway / NBUT 1440 Subway / SCU 2186 Subway(图论,最短距离)

    POJ 2502 Subway / NBUT 1440 Subway / SCU 2186 Subway(图论,最短距离) Description You have just moved from a ...

  5. POJ 2502 - Subway Dijkstra堆优化试水

    做这道题的动机就是想练习一下堆的应用,顺便补一下好久没看的图论算法. Dijkstra算法概述 //从0出发的单源最短路 dis[][] = {INF} ReadMap(dis); for i = 0 ...

  6. L - Subway(最短路spfa)

    L - Subway(最短路spfa) You have just moved from a quiet Waterloo neighbourhood to a big, noisy city. In ...

  7. POJ 2502 Subway(迪杰斯特拉)

    Subway Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6692   Accepted: 2177 Descriptio ...

  8. POJ 2502 Subway (Dijkstra 最短+建设规划)

    Subway Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6689   Accepted: 2176 Descriptio ...

  9. POJ 2502 Subway (最短路)

    Subway 题目链接: http://acm.hust.edu.cn/vjudge/contest/122685#problem/L Description You have just moved ...

随机推荐

  1. C语言中,如何通过socket得到对端IP地址

    struct sockaddr_in clientaddr1; memset(&clientaddr1, 0x00, sizeof(clientaddr1)); socklen_t nl=si ...

  2. oracle行列转换总结-转载自ITPUB

    原贴地址:http://www.itpub.net/thread-1017026-1-1.html 谢谢原贴大人 最近论坛很多人提的问题都与行列转换有关系,所以我对行列转换的相关知识做了一个总结, 希 ...

  3. Xcode 7:Storyboard Reference、Strong IBOutlet以及Scene Dock

    本文由CocoaChina译者小袋子(博客)翻译原文:Storyboard Reference, Strong IBOutlet, Scene Dock in iOS 9 在这个教程中,我想要聊一些有 ...

  4. iOS 获取通讯录里边的电话号码AddressBook

    1  首先导入库 <AddressBook/AddressBook.h> 2 然后在导入#import <AddressBook/AddressBook.h>文件 3 声明   ...

  5. winform(C#)拖拽实现获得文件路径

    设置Form的AllowDrop为true  private void Form1_DragDrop(object sender, DragEventArgs e)        {          ...

  6. MySQL增删改查的常用操作指令总结

    总结: 1.数据库操作: 创建库: create database db_name; 查询库: show databases; //显示所有的数据库 show create databases db_ ...

  7. JeeSite试用

    JeeSite主要定位于企业信息化领域.网址:http://www.oschina.net/p/jeesite 从描述来看,各种NB,下来看的最主要原因是最近还在更新,觉得有问题可以有一批人一起研究研 ...

  8. Sublime text3 JS语法检测工具安装及使用

    Sublime text3 JS语法检测工具安装及使用 工具/原料 sublime text3 nodejs sublimeLinter sublimeLinter-jshint 方法/步骤 首先ct ...

  9. VIM快捷键(转)

    VIM快捷键:光标移动:四个方向   kh 0 l   j  ctrl+f, ctrl+b                 向下翻页,向上翻页  ctrl+d, ctrl+u              ...

  10. NLP相关资源

    一 NLP相关资源站点 Rouchester大学NLP/CL会议列表 一个非常好的会议时间信息网站,将自然语言处理和计算语言学领域的会议,按照时间月份顺序列出. NLPerJP 一个日本友好人士维护的 ...