POJ-2502-Subway

378 篇文章 0 订阅

这个题是说给你2个坐标分别是起点和终点,然后给出你一些航线,要求你起点到终点的最短时间。

注意:步行和坐车的速度是不一样的,单位也需要进行一个转换,建图的时候转换为对应的时间作为权值

然后求出起点到终点的最短路径即可

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
using namespace std;
const int maxn=501;
const int inf=1<<29;
struct node
{
    int x;
    int y;
}p[maxn];
double map[maxn][maxn],dist[maxn];
bool vis[maxn];
void Init()
{
    for(int i=1;i<maxn;i++)
	for(int j=1;j<maxn;j++)
	    if(i==j)map[i][j]=0;
	    else map[i][j]=inf;
}
double Dis(int i,int j)
{
    return sqrt(1.0*(p[i].x-p[j].x)*(p[i].x-p[j].x)+(p[i].y-p[j].y)*(p[i].y-p[j].y));
}
double Distra(int st,int n)
{
    for(int i=1;i<=n;i++)
	dist[i]=map[st][i];
    memset(vis,0,sizeof(vis));
    for(int i=1;i<n;i++)
    {
	double mini=inf;
	int pos=-1;
	for(int j=1;j<=n;j++)
	    if(!vis[j]&&dist[j]<mini)
	    {
		mini=dist[j];
		pos=j;
	    }
	if(pos==-1)
	    break;
	vis[pos]=1;
	for(int j=1;j<=n;j++)
	    if(!vis[j]&&dist[j]>dist[pos]+map[pos][j])
		dist[j]=dist[pos]+map[pos][j];
    }
    return dist[2];
}
int main()
{
    double v1=40000.0/60.0;
    double v2=10000.0/60.0;
    Init();
    scanf("%d%d%d%d",&p[1].x,&p[1].y,&p[2].x,&p[2].y);
    int n=3,last=3;
    while(scanf("%d%d",&p[n].x,&p[n].y)!=EOF)
    {
	if(p[n].x==-1&&p[n].y==-1)
	{
	    last=n;
	    continue;
	}
	if(last!=n)
	    map[n-1][n]=map[n][n-1]=Dis(n-1,n)/v1;
	n++;
    }
    n--;
    for(int i=1;i<=n;i++)
	for(int j=1;j<=n;j++)
	    map[i][j]=min(map[i][j],Dis(i,j)/v2);
    printf("%.0f\n",Distra(1,n));
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值