HDU-2722-Here We Go(relians) Again

ACM模版

描述


题解

题目好难读懂啊,于是看了大牛(shuangde800)的题解,发现好水啊,基础的最短路,就是处理输入比较麻烦,读入数据时比较花,看不懂题真心搞不好这道题~~~

代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <utility>

using namespace std;

typedef pair<int, int> pii;
const int INF = 0x3f3f3f3f;
const int MAXN = 100;
const int MAXV = 445;
const int MAXE = MAXV * MAXV / 2;
const int MAXL = 2520;

struct Edge
{
    int v, next, w;
} E[MAXE];

int n;
int m;
int vn;
int size;
int head[MAXV];
int lowcost[MAXV];

void addEdge(int u, int v, int w)
{
    E[size].v = v;
    E[size].w = w;
    E[size].next = head[u];
    head[u] = size++;
}

void init()
{
    vn = (m + 1) * (n + 1);
    size = 0;
    memset(head, -1, sizeof(head));
}

void Dijkstra(int src)
{
    memset(lowcost, 0x3f, sizeof(lowcost));

    lowcost[src] = 0;
    priority_queue<pii, vector<pii>, greater<pii> > q;
    q.push(make_pair(lowcost[src],src));

    while (!q.empty())
    {
        pii x = q.top();
        q.pop();
        int u = x.second;
        if (lowcost[u] != x.first)
        {
            continue;
        }
        for (int e = head[u]; e != -1; e = E[e].next)
        {
            int tmp = lowcost[u] + E[e].w;
            if (lowcost[E[e].v] > tmp)
            {
                lowcost[E[e].v] = tmp;
                q.push(make_pair(tmp, E[e].v));
            }
        }
    }
}

int main()
{
    char str[MAXN];

    int u, w;
    while (~scanf("%d%d%*c", &n, &m) && n + m)
    {
        init();

        for (int i = 1; i <= n * 2 + 1; ++i)
        {
            fgets(str, MAXN, stdin);
            int len = (int)strlen(str);
            if (i & 1)
            {
                for (int j = 0, k = 1; j < len; j += 4, ++k)
                {
                    u = (m + 1) * (i / 2) + k;
                    w = str[j] - '0';
                    if (w == 0)
                    {
                        continue;
                    }
                    if (str[j + 2] == '*')
                    {
                        addEdge(u, u + 1, MAXL / w);
                        addEdge(u + 1, u, MAXL / w);
                    }
                    else if (str[j + 2] == '<')
                    {
                        addEdge(u + 1, u, MAXL / w);
                    }
                    else
                    {
                        addEdge(u, u + 1, MAXL / w);
                    }
                }
            }
            else
            {
                for (int j = 0, k = 1; j < len; j += 4, ++k)
                {
                    u = (m + 1) * (i / 2 - 1) + k;
                    w = str[j] - '0';
                    if (w == 0)
                    {
                        continue;
                    }
                    if (str[j + 2] == '*')
                    {
                        addEdge(u, u + m + 1, MAXL / w);
                        addEdge(u + m + 1, u, MAXL / w);
                    }
                    else if (str[j + 2] == 'v')
                    {
                        addEdge(u, u + m + 1, MAXL / w);
                    }
                    else if (str[j + 2] == '^')
                    {
                        addEdge(u + m + 1, u, MAXL / w);
                    }
                }
            }
        }

        Dijkstra(1);

        if (lowcost[vn] != INF)
        {
            printf("%d blips\n", lowcost[vn]);
        }
        else
        {
            puts("Holiday");
        }
    }

    return 0;
}

参考

《最短路》

全部评论

相关推荐

04-02 10:09
门头沟学院 Java
用微笑面对困难:这里面问题还是很多的,我也不清楚为啥大家会感觉没啥问题。首先就是全栈开发实习9个月的内容都没有java实习生的内容多,1整个技术栈没看出太核心和难点的内容,感觉好像被拉过去打杂了,而且全栈基本上很容易被毙。里面能问的bug是在太多了比如L:继承 BaseMapper 可直接使用内置方法’。请问你的 BaseMapper 是如何扫描实体类注解如果瞬时产生 100 个上传任务,MySQL 的索引设计是否会有瓶颈?你做过分库分表或者索引优化吗?全栈的内容可以针对动态难点去搞,技能特长写在下面吧,你写了这么多技能,项目和实习体现了多少?你可以在项目里多做文章然后把这个放下去,从大致来看实习不算太水,有含金量你也要写上内容针对哨兵里面的节点变化能问出一万个问题,这个很容易就爆了。
提前批简历挂麻了怎么办
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务