[POJ 2502]Subway[最短路]

来源:互联网 发布:网络电玩城 编辑:程序博客网 时间:2024/05/22 12:50

题目链接:[POJ 2502]Subway[最短路]
题意分析:
你从A到B上学,可以选择走路或者到地铁站搭乘地铁到达,走路速度10km/h,地铁速度40km/h,你可以任意站点下车上车,问:最快要多少分钟到达学校?
解题思路:
建图求最短路即可。

  • 地铁每条线路相邻站点之间建一条双向边,速度40km/h
  • 所有点之间建双向边,速度10km/h

over。
个人感受:
心塞!!!spfa写错了超级粗心的错误,debug有两个多小时。然后debug完发现还是WA了,最终才知道是建图出了问题!!!当初觉得同一条线路肯定能搭地铁最快,没想到还能走路!!!TAT。给个这种样例,红色是地铁,蓝色是走路。如下:
这里写图片描述
具体代码如下:

#include<cmath>#include<cstdio>#include<cstring>using namespace std;const int MAXN = 311;const int INF = 0x7f7f7f7f;struct Edge{    int to, next;    double w;}edge[2 * MAXN * MAXN];int head[MAXN], cnt, sta[MAXN];double x[MAXN], y[MAXN], dis[MAXN];bool in[MAXN];void add_edge(int from, int to, double w){    edge[cnt].to = to;    edge[cnt].w = w;    edge[cnt].next = head[from];    head[from] = cnt++;}void double_make(int from, int to, double w){    add_edge(from, to, w);    add_edge(to, from, w);}double getdis(int a, int b){    double delx = x[a] - x[b], dely = y[a] - y[b];    return sqrt(delx * delx + dely * dely);}void spfa(int s){    dis[s] = 0;    int top = 0;    sta[top++] = s;    in[s] = 1;    while (top)    {        int cur = sta[--top]; in[cur] = 0;  // in[cur] 写成了 in[s]。哭瞎。        for (int i = head[cur]; ~i; i = edge[i].next)        {            Edge &e = edge[i];            if (dis[e.to] > dis[cur] + e.w)            {                dis[e.to] = dis[cur] + e.w;                if (!in[e.to])                {                    in[e.to] = 1;                    sta[top++] = e.to;                }            }        }    }}int main(){    memset(head, -1, sizeof head);    for (int i = 0; i < 311; ++i) dis[i] = INF;    scanf("%lf %lf %lf %lf", &x[0], &y[0], &x[1], &y[1]);    int n = 2, last = 0;    while (~scanf("%lf %lf", &x[n], &y[n]))    {        if (x[n] == -1 && y[n] == -1)        {            last = 0;            continue;        }        if (last) double_make(last, n, getdis(last, n) * 3.0 / 2000.0);        last = n++;    }    for (int i = 0; i < n; ++i)        for (int j = i + 1; j < n; ++j)        {            double_make(i, j, getdis(i, j) * 3.0 / 500.0); // 不管怎么样,在每个站点都有权利选择走到其它站点        }    spfa(0);    printf("%.0f\n", round(dis[1]));    return 0;}
0 0
原创粉丝点击