相当于模板题了,用trie来完成字符串到数字的映射比map<string, int>要快不少,令外可以考虑hash。

运行时间对比:

(1)(2)600ms左右 (3)3000ms左右(4)1500ms左右

(1)O(n^2)的dijkstra:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#include <map>
using namespace std;
 
#define umin(a, b) if ((a) > (b)) (a) = (b)
 
const int maxn = 157;
 
int n;
struct Trie {
    int ch[maxn * 32][26];
    int val[maxn * 32], sz;
    void init() {
        memset(val, 0, sizeof(val));
        memset(ch[0], 0, sizeof(ch[0]));
        sz = 0;
    }
    int insert(char *s) {
        int i = 0, j = 0;
        for (; s[j]; i = ch[i][s[j]], j ++) {
            if (s[j] < 'a') s[j] -= 'A';
            else s[j] -= 'a';
            if (!ch[i][s[j]]) {
                ch[i][s[j]] = ++ sz;
                memset(ch[sz], 0, sizeof(ch[sz]));
            }
        }
        if (!val[i]) val[i] = ++ n;
        return val[i];
    }
} trie;
 
int dist[maxn][maxn], d[maxn];
bool vis[maxn];
 
int main()
{
#ifndef ONLINE_JUDGE
    freopen("in.txt""r", stdin);
#endif // ONLINE_JUDGE
    int m;
    char s1[40], s2[40];
    int t;
    while (cin >> m, ~m) {
        n = 0;
        trie.init();
        scanf("%s%s", s1, s2);
        trie.insert(s1);
        t = trie.insert(s2);
        memset(dist, 0x3f, sizeof(dist));
        for (int i = 0; i < m; i ++) {
            int x;
            scanf("%s%s%d", s1, s2, &x);
            int u = trie.insert(s1), v = trie.insert(s2);
            umin(dist[u][v], x);
            umin(dist[v][u], x);
        }
        memset(vis, 0, sizeof(vis));
        memset(d, 0x3f, sizeof(d));
        d[1] = 0;
        for (int i = 1; i < n; i ++) {
            int pos = 0, mind = 0x3f3f3f3f;
            for (int j = 1; j <= n; j ++) {
                if (!vis[j] && d[j] < mind) {
                    mind = d[j];
                    pos = j;
                }
            }
            if (!pos) break;
            vis[pos] = true;
            for (int j = 1; j <= n; j ++) {
                if (!vis[j]) umin(d[j], d[pos] + dist[pos][j]);
            }
        }
        printf("%d\n", d[t] == 0x3f3f3f3f? -1 : d[t]);
    }
    return 0;
}

(2)SPFA:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#include <map>
using namespace std;
 
#define umin(a, b) if ((a) > (b)) (a) = (b)
 
const int maxn = 157;
 
int n;
struct Trie {
    int ch[maxn * 32][26];
    int val[maxn * 32], sz;
    void init() {
        memset(val, 0, sizeof(val));
        memset(ch[0], 0, sizeof(ch[0]));
        sz = 0;
    }
    int insert(char *s) {
        int i = 0, j = 0;
        for (; s[j]; i = ch[i][s[j]], j ++) {
            if (s[j] < 'a') s[j] -= 'A';
            else s[j] -= 'a';
            if (!ch[i][s[j]]) {
                ch[i][s[j]] = ++ sz;
                memset(ch[sz], 0, sizeof(ch[sz]));
            }
        }
        if (!val[i]) val[i] = ++ n;
        return val[i];
    }
} trie;
 
vector<vector<int> >G, W;
queue<int> Q;
int d[maxn];
bool mark[maxn];
 
bool relax(int u, int v, int w) {
    if (d[v] > d[u] + w) {
        d[v] = d[u] + w;
        return true;
    }
    return false;
}
 
int main()
{
#ifndef ONLINE_JUDGE
    freopen("in.txt""r", stdin);
#endif // ONLINE_JUDGE
    int m;
    char s1[40], s2[40];
    int t;
    while (cin >> m, ~m) {
        n = 0;
        trie.init();
        scanf("%s%s", s1, s2);
        trie.insert(s1);
        t = trie.insert(s2);
        G.clear();
        W.clear();
        G.resize(maxn + 2);
        W.resize(maxn + 2);
        for (int i = 0; i < m; i ++) {
            int x;
            scanf("%s%s%d", s1, s2, &x);
            int u = trie.insert(s1), v = trie.insert(s2);
            G[u].push_back(v);
            G[v].push_back(u);
            W[u].push_back(x);
            W[v].push_back(x);
        }
        while (!Q.empty()) Q.pop();
        Q.push(1);
        memset(d, 0x3f, sizeof(d));
        memset(mark, 0, sizeof(mark));
        mark[1] = true;
        d[1] = 0;
        while (!Q.empty()) {
            int h = Q.front(); Q.pop();
            for (int i = 0; i < G[h].size(); i ++) {
                int v = G[h][i], r = relax(h, v, W[h][i]);
                if (!mark[v] && r) {
                    mark[v] = true;
                    Q.push(v);
                }
            }
            mark[h] = false;
        }
        printf("%d\n", d[t] == 0x3f3f3f3f? -1 : d[t]);
    }
    return 0;
}

(3)map + cin :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#include <map>
using namespace std;
const int maxn = 2e4 +7;
map<string, int> mp;
int n;
vector<vector<int> >G, W;
queue<int> Q;
bool mark[maxn];
int d[maxn];
bool relax(int u, int v, int w) {
    if (d[v] > d[u] + w) {
        d[v] = d[u] + w;
        return true;
    }
    return false;
}
int main()
{
#ifndef ONLINE_JUDGE
    freopen("in.txt""r", stdin);
#endif // ONLINE_JUDGE
    string s1, s2, S;
    int x, m;
    while (cin >> m, ~m) {
        cin >> s1 >> s2;
        S = s2;
        n = 1;
        mp.clear();
        G.clear();
        W.clear();
        G.resize(maxn + 2);
        W.resize(maxn + 2);
        if (!mp[s1]) mp[s1] = n ++;
        if (!mp[s2]) mp[s2] = n ++;
        for (int i = 0; i < m; i ++) {
            cin >> s1 >> s2 >> x;
            if (!mp[s1]) mp[s1] = n ++;
            if (!mp[s2]) mp[s2] = n ++;
            G[mp[s1]].push_back(mp[s2]);
            G[mp[s2]].push_back(mp[s1]);
            W[mp[s1]].push_back(x);
            W[mp[s2]].push_back(x);
        }
        while (!Q.empty()) Q.pop();
        Q.push(1);
        memset(d, 0x3f, sizeof(d));
        memset(mark, 0, sizeof(mark));
        mark[1] = true;
        d[1] = 0;
        while (!Q.empty()) {
            int h = Q.front(); Q.pop();
            for (int i = 0; i < G[h].size(); i ++) {
                int v = G[h][i], r = relax(h, v, W[h][i]);
                if (!mark[v] && r) {
                    mark[v] = true;
                    Q.push(v);
                }
            }
            mark[h] = false;
        }
        printf("%d\n", d[mp[S]] == 0x3f3f3f3f? -1 : d[mp[S]]);
    }
    return 0;
}

(4)map + scanf:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
#include <map>
using namespace std;
const int maxn = 2e4 +7;
map<string, int> mp;
int n;
vector<vector<int> >G, W;
queue<int> Q;
bool mark[maxn];
int d[maxn];
bool relax(int u, int v, int w) {
    if (d[v] > d[u] + w) {
        d[v] = d[u] + w;
        return true;
    }
    return false;
}
 
void read_string(string &s) {
    char s0[100];
    scanf("%s", s0);
    s = string(s0);
}
 
int main()
{
#ifndef ONLINE_JUDGE
    freopen("in.txt""r", stdin);
#endif // ONLINE_JUDGE
    string s1, s2, S;
    int x, m;
    while (cin >> m, ~m) {
        read_string(s1);
        read_string(s2);
        S = s2;
        n = 1;
        mp.clear();
        G.clear();
        W.clear();
        G.resize(maxn + 2);
        W.resize(maxn + 2);
        if (!mp[s1]) mp[s1] = n ++;
        if (!mp[s2]) mp[s2] = n ++;
        for (int i = 0; i < m; i ++) {
            read_string(s1);
            read_string(s2);
            scanf("%d", &x);
            if (!mp[s1]) mp[s1] = n ++;
            if (!mp[s2]) mp[s2] = n ++;
            G[mp[s1]].push_back(mp[s2]);
            G[mp[s2]].push_back(mp[s1]);
            W[mp[s1]].push_back(x);
            W[mp[s2]].push_back(x);
        }
        while (!Q.empty()) Q.pop();
        Q.push(1);
        memset(d, 0x3f, sizeof(d));
        memset(mark, 0, sizeof(mark));
        mark[1] = true;
        d[1] = 0;
        while (!Q.empty()) {
            int h = Q.front(); Q.pop();
            for (int i = 0; i < G[h].size(); i ++) {
                int v = G[h][i], r = relax(h, v, W[h][i]);
                if (!mark[v] && r) {
                    mark[v] = true;
                    Q.push(v);
                }
            }
            mark[h] = false;
        }
        printf("%d\n", d[mp[S]] == 0x3f3f3f3f? -1 : d[mp[S]]);
    }
    return 0;
}

[hdu2112]最短路的更多相关文章

  1. HDU2112 HDU Today 最短路+字符串哈希

    HDU Today Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  2. hdu2112(HDU Today 简单最短路)

    Problem Description 经过锦囊相助,海东集团终于度过了危机,从此,HDU的发展就一直顺风顺水,到了2050年,集团已经相当规模了,据说进入了钱江肉丝经济开发区500强.这时候,XHD ...

  3. Hdu-2112 HDU Today (单源多点最短路——Dijsktra算法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2112 题目大意:给你N个公交车站,起点,终点,各站之间的距离,求起点到终点之间的最短距离.(起点终点相 ...

  4. hdu2112 HDU Today 基础最短路

    这题的关键是把车站的名字转化为点的编号.我用的是map.声明一个map<string,int> st,然后按照字符串出现的次序给st赋值.例如:st[s1]=2;代表这字符串s1出现的次序 ...

  5. bzoj1001--最大流转最短路

    http://www.lydsy.com/JudgeOnline/problem.php?id=1001 思路:这应该算是经典的最大流求最小割吧.不过题目中n,m<=1000,用最大流会TLE, ...

  6. 【USACO 3.2】Sweet Butter(最短路)

    题意 一个联通图里给定若干个点,求他们到某点距离之和的最小值. 题解 枚举到的某点,然后优先队列优化的dijkstra求最短路,把给定的点到其的最短路加起来,更新最小值.复杂度是\(O(NElogE) ...

  7. Sicily 1031: Campus (最短路)

    这是一道典型的最短路问题,直接用Dijkstra算法便可求解,主要是需要考虑输入的点是不是在已给出的地图中,具体看代码 #include<bits/stdc++.h> #define MA ...

  8. 最短路(Floyd)

    关于最短的先记下了 Floyd算法: 1.比较精简准确的关于Floyd思想的表达:从任意节点A到任意节点B的最短路径不外乎2种可能,1是直接从A到B,2是从A经过若干个节点X到B.所以,我们假设maz ...

  9. bzoj1266最短路+最小割

    本来写了spfa wa了 看到网上有人写Floyd过了 表示不开心 ̄へ ̄ 改成Floyd试试... 还是wa ヾ(。`Д´。)原来是建图错了(样例怎么过的) 结果T了 于是把Floyd改回spfa 还 ...

随机推荐

  1. vue-element-admin执行npm install 报错

    如果你出现这类报错: 那么恭喜你,因为这个问题很好解决. ----------------------- 解决方法: git config --global url."https://&qu ...

  2. C++基础 学习笔记五:重载之运算符重载

    C++基础 学习笔记五:重载之运算符重载 什么是运算符重载 用同一个运算符完成不同的功能即同一个运算符可以有不同的功能的方法叫做运算符重载.运算符重载是静态多态性的体现. 运算符重载的规则 重载公式 ...

  3. [linux] 小问题:管道符,换行问题等;[nginx]启动,重启,关闭命令;以及升级nginx切换命令

    Lniux换行问题 后面回车不会马上执行本条命令而是换行继续. : 是运行完前面就继续后面的, && 同样是前面正确就运行后面, || 是前面运行不正确就运行后面. | 管道符“|”将 ...

  4. [整理]svn常见问题汇总

    1.’.’ is not a working copy.Can’t open file‘.svn/entries’: 系统找不到指定的路径.解答:原因是输入的访问路径不正确,如svn://192.16 ...

  5. 2020.4面试分享(7面收割5个offer)

    都说金三银四是找工作的最佳时节,由于本人的个人职业规划跟目前工作内容不太相符(具体原因就不透露了,领导平时也要来这里逛,哈哈),四月份挑选了10多家公司投递简历(公司规模从几十人到上万人都有),参加了 ...

  6. iview使用之怎样通过render函数在tabs组件中添加标签

    在实际项目开发中我们通常会遇到一些比较'新颖'的需求,而这时iview库里往往没有现成可用的组件示例,所以我们就需要自己动手翻阅IviewAPI进行自定义一些组件,也可以说是将iview库里的多种组件 ...

  7. Python代码覆盖率分析工具Coverage

    简介 在测试中,为了度量产品质量,代码覆盖率被作为一种测试结果的评判依据,在Python代码中用来分析代码覆盖率的工具当属Coverage.代码覆盖率是由特定的测试套件覆盖被测源代码的程度来度量,Co ...

  8. python模块一键安装

    利用bat文件 在不懂电脑的小白电脑上一键安装你python环境所需要的模块(你想让她一个个安装,你会疯的) 先新建一个txt文件,把你需要安装的模块和版本号写进去: 然后再新建一个txt文件 然后把 ...

  9. 监控MySQL服务及httpd服务

    一:监控MySQL服务 [root@server ~]# vim /usr/local/zabbix/etc/zabbix_agentd.conf PidFile=/tmp/zabbix_agentd ...

  10. Linux网络服务第三章远程访问及控制

    1.笔记 655355:端口限制 监听地址:对外提供服务的地址 AllowUsers:仅允许用户登录 DenyUsers:仅禁止用户登录 AllowUsers-用户名-公网地址 ssh/id_rsa. ...