博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
L - Subway - POJ 2502
阅读量:5236 次
发布时间:2019-06-14

本文共 1783 字,大约阅读时间需要 5 分钟。

题意:在一个城市里,分布着若干条地铁线路,每条地铁线路有若干个站点,所有地铁的速度均为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;
}

 

转载于:https://www.cnblogs.com/liuxin13/p/4660491.html

你可能感兴趣的文章
Android PullToRefreshExpandableListView的点击事件
查看>>
系统的横向结构(AOP)
查看>>
linux常用命令
查看>>
NHibernate.3.0.Cookbook第四章第6节的翻译
查看>>
使用shared memory 计算矩阵乘法 (其实并没有加速多少)
查看>>
Django 相关
查看>>
git init
查看>>
训练记录
查看>>
IList和DataSet性能差别 转自 http://blog.csdn.net/ilovemsdn/article/details/2954335
查看>>
Hive教程(1)
查看>>
第16周总结
查看>>
C#编程时应注意的性能处理
查看>>
Fragment
查看>>
比较安全的获取站点更目录
查看>>
苹果开发者账号那些事儿(二)
查看>>
使用C#交互快速生成代码!
查看>>
UVA11374 Airport Express
查看>>
P1373 小a和uim之大逃离 四维dp,维护差值
查看>>
NOIP2015 运输计划 树上差分+树剖
查看>>
P3950 部落冲突 树链剖分
查看>>