思路:单源最短路末班就好了,字符串映射成数字处理。


AC代码

//#define LOCAL
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>
#include <map>
#include <vector>
#include <string>
using namespace std;
#define inf 0x3f3f3f3f
const int maxn = 200;
map<string, int> ha;
int id, st, ed;
int n, k;
int hap[maxn];
char names[maxn][50];

int getId(string s) {
    if(!ha.count(s)) {
        ha[s] = id++;
    }
    return ha[s];
}

struct Edge {
    int from, to, dist;
    Edge(int u, int v, int d):from(u),to(v),dist(d) {}
};
vector<Edge> edges;
vector<int> G[maxn];
bool done[maxn];
int d[maxn], hp[maxn], pt[maxn], routes[maxn]; //Best
int p[maxn];

void init() {
    ha.clear();
    id = 0;
    for(int i = 0; i < maxn; i++) G[i].clear();
    edges.clear();
}

void addEdge(int from, int to, int dist) {
    edges.push_back(Edge(from, to, dist));
    int m = edges.size();
    G[from].push_back(m-1);
}

struct HeapNode{
    int d, u;
    HeapNode(int d, int u):d(d), u(u){
    }
    bool operator < (const HeapNode& rhs) const {
        return d > rhs.d;
    }
};

//距离小,开心多,平均大
void dijkstra(int s) {
    memset(done, 0, sizeof(done));
    priority_queue<HeapNode> Q;
    for(int i = 0; i < n; i++) {
        d[i] = inf;
        hp[i] = -inf;
        pt[i] = inf;
    }
    d[s] = hp[s] = pt[s] = 0;
    routes[s] = 1;
    Q.push(HeapNode(0, s));
    while(!Q.empty()) {
        HeapNode x = Q.top(); Q.pop();
        int u = x.u;
        if(done[u]) continue;
        done[u] = true;
        for(int i = 0; i < G[u].size(); i++) {
            Edge& e = edges[G[u][i]];
            bool update = false;
            if(d[e.to] > d[u] + e.dist) {
                routes[e.to] = routes[u];
                update = true;
            } else if(d[e.to] == d[u] + e.dist) {
                routes[e.to] += routes[u];
                if(hp[e.to] < hp[u] + hap[e.to]) {
                    update = true;
                } else if(hp[e.to] == hp[u] + hap[e.to]) {
                    if(pt[e.to] > pt[u] + 1) {
                        update = true;
                    }
                }
            }
            if(update) {
                d[e.to] = d[u] + e.dist;
                p[e.to] = u;
                hp[e.to] = hp[u] + hap[e.to];
                pt[e.to] = pt[u] + 1;
                Q.push(HeapNode(d[e.to], e.to));
            }
        }
    }
}

void print(int u) {
    if(u == 0) {
        printf("%s", names[0]);
        return;
    } else {
        print(p[u]);
        printf("->%s", names[u]);
    }
}

int main() {
#ifdef LOCAL
    freopen("data.in", "r", stdin);
    freopen("data.out", "w", stdout);
#endif
    while(scanf("%d%d%s", &n, &k, names[0]) == 3) {
        init();
        st = getId(names[0]);
        int happy;
        for(int i = 1; i < n; i++) {
            scanf("%s %d", names[i], &happy);
            int u = getId(names[i]);
            hap[u] = happy;
        }
        ed = getId("ROM");
        char x[50], y[50];
        int u, v, cost;
        for(int i = 0; i < k; i++) {
            scanf("%s%s%d", x, y, &cost);
            u = getId(x), v = getId(y);
            //printf("%d %d\n", u, v);
            addEdge(u, v, cost);
            addEdge(v, u, cost);
        }
        dijkstra(0);
        printf("%d %d %d %d\n", routes[ed], d[ed], hp[ed], (int)(hp[ed]/pt[ed]));
        print(ed);
        printf("\n");
    }
    return 0;
}

如有不当之处欢迎指出!

PAT All Roads Lead to Rome 单源最短路的更多相关文章

  1. PAT 1087 All Roads Lead to Rome[图论][迪杰斯特拉+dfs]

    1087 All Roads Lead to Rome (30)(30 分) Indeed there are many different tourist routes from our city ...

  2. PAT 1087 All Roads Lead to Rome

    PAT 1087 All Roads Lead to Rome 题目: Indeed there are many different tourist routes from our city to ...

  3. PAT甲级1087. All Roads Lead to Rome

    PAT甲级1087. All Roads Lead to Rome 题意: 确实有从我们这个城市到罗马的不同的旅游线路.您应该以最低的成本找到您的客户的路线,同时获得最大的幸福. 输入规格: 每个输入 ...

  4. PAT 甲级 1087 All Roads Lead to Rome(SPFA+DP)

    题目链接 All Roads Lead to Rome 题目大意:求符合题意(三关键字)的最短路.并且算出路程最短的路径有几条. 思路:求最短路并不难,SPFA即可,关键是求总路程最短的路径条数. 我 ...

  5. pat1087. All Roads Lead to Rome (30)

    1087. All Roads Lead to Rome (30) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yu ...

  6. PAT_A1087#All Roads Lead to Rome

    Source: PAT A1087 All Roads Lead to Rome (30 分) Description: Indeed there are many different tourist ...

  7. [图的遍历&多标准] 1087. All Roads Lead to Rome (30)

    1087. All Roads Lead to Rome (30) Indeed there are many different tourist routes from our city to Ro ...

  8. PAT1087. All Roads Lead to Rome

    PAT1087. All Roads Lead to Rome 题目大意 给定一个图的边权和点权, 求边权最小的路径; 若边权相同, 求点权最大; 若点权相同, 则求平均点权最大. 思路 先通过 Di ...

  9. 最短路模板(Dijkstra & Dijkstra算法+堆优化 & bellman_ford & 单源最短路SPFA)

    关于几个的区别和联系:http://www.cnblogs.com/zswbky/p/5432353.html d.每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个(草儿家到 ...

随机推荐

  1. Hyperledger Fabric Chaincode for Operators——实操智能合约

    什么是Chaincode(智能合约)? chaincode是一个程序,它是使用Go语言编写的,最终在Java等其他编程语言中实现了指定的接口.chaincode运行在一个被背书peer进程独立出来的安 ...

  2. 解决C#编译中"csc不是内部或外部命令"的问题

    安装完 VisualStudio 编译环境后,是不能用命令行直接编译写好的csc文件的,如果不配置环境变量,在命令提示符(cmd)中编译扩展名为cs的文件,会出现错误提示"csc不是内部或外 ...

  3. Codeforce D. Make a Permutation!

    D. Make a Permutation! time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  4. python selenium 鼠标悬停

    #鼠标悬停 chain = ActionChains(driver) implement = driver.find_element_by_link_text() chain.move_to_elem ...

  5. PHP支付第3方接口使用方法。

    去年写过一遍博客文章. 网站申请不到支付宝接口.微信接口,免接口收款实现方式. 网络在发展,支付宝也好,微信也好,技术在进步,这种方式已经不能使用了,明显的一个问题是,支付宝的刷新工具,会定时退出,必 ...

  6. AppScan扫描结果分析及工具栏使用

    Appscan的窗口大概分三个模块,Application Links(应用链接), Security Issues(安全问题), and Analysis(分析) Application Links ...

  7. 缓存之ehcache

    1.EhCache缓存框架简介 EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hibernate中默认的CacheProvider. 我们使用EhCache缓存框架主要是为 ...

  8. ffmpeg转码使用硬件加速

    需求源于手机拍摄的视频,默认参数码率较大,拍摄的文件体积较大,不便于保存和转发.手机默认拍照的720P视频,默认码率达到4M,实际上转成1M就差不多了.FFmpeg默认的转码是使用软件解码,然后软件编 ...

  9. HTA基础

    HTA是HTML应用程序(HTML Application)的缩写,可以使用HTML中的绝大多数标签.脚本等.直接将HTML保存成HTA的格式,就是一个能够独立运行的应用软件. 与普通HTML网页相比 ...

  10. 夏令营讲课内容整理 Day 4.

    本日主要内容就是搜索(打暴力 搜索可以说是OIer必会的算法,同时也是OI系列赛事常考的算法之一. 有很多的题目都可以通过暴力搜索拿到部分分,而在暴力搜索的基础上再加一些剪枝优化, 就有可能会拿到更多 ...