AcWing
  • 首页
  • 课程
  • 题库
  • 更多
    • 竞赛
    • 题解
    • 分享
    • 问答
    • 应用
    • 校园
  • 关闭
    历史记录
    清除记录
    猜你想搜
    AcWing热点
  • App
  • 登录/注册

AcWing 1129. $\Large\color{blue}{【算法提高课】热浪(\text{Dijkstra})}$    原题链接    简单

作者: 作者的头像   incra ,  2022-11-12 07:34:44 ,  所有人可见 ,  阅读 1192


19


<—点个赞吧QwQ

宣传一下算法提高课整理{:target=”_blank”}

德克萨斯纯朴的民众们这个夏天正在遭受巨大的热浪!!!

他们的德克萨斯长角牛吃起来不错,可是它们并不是很擅长生产富含奶油的乳制品。

农夫John此时身先士卒地承担起向德克萨斯运送大量的营养冰凉的牛奶的重任,以减轻德克萨斯人忍受酷暑的痛苦。

John已经研究过可以把牛奶从威斯康星运送到德克萨斯州的路线。

这些路线包括起始点和终点一共有 $T$ 个城镇,为了方便标号为 $1$ 到 $T$。

除了起点和终点外的每个城镇都由 双向道路 连向至少两个其它的城镇。

每条道路有一个通过费用(包括油费,过路费等等)。

给定一个地图,包含 $C$ 条直接连接 $2$ 个城镇的道路。

每条道路由道路的起点 $R_s$,终点 $R_e$ 和花费 $C_i$ 组成。

求从起始的城镇 $T_s$ 到终点的城镇 $T_e$ 最小的总费用。

输入格式

第一行: $4$ 个由空格隔开的整数: $T, C, T_s, T_e$;

第 $2$ 到第 $C+1$ 行: 第 $i+1$ 行描述第 $i$ 条道路,包含 $3$ 个由空格隔开的整数: $R_s, R_e, C_i$。

输出格式

一个单独的整数表示从 $T_s$ 到 $T_e$ 的最小总费用。

数据保证至少存在一条道路。

数据范围

$1 \\le T \\le 2500$,
$1 \\le C \\le 6200$,
$1 \\le T_s,T_e,R_s,R_e \\le T$,
$1 \\le C_i \\le 1000$

输入样例:

7 11 5 4
2 4 2
1 4 3
7 2 2
3 4 3
5 7 5
7 3 3
6 1 1
6 3 4
2 4 3
5 6 3
7 2 1

输出样例:

7

思路

$\text{Dijkstra}$模板,有啥好说的。。。
SPFA他没了

代码

#include <iostream>
#include <cstring>
using namespace std;
const int N = 2510;
int n,m,st,ed;
int g[N][N];
bool vis[N];
int dist[N];
int dijkstra () {
    memset (dist,0x3f,sizeof (dist));
    dist[st] = 0;
    for (int i = 1;i <= n;i++) {
        int t = -1;
        for (int j = 1;j <= n;j++) {
            if (!vis[j] && (t == -1 || dist[t] > dist[j])) t = j;
        }
        vis[t] = true;
        for (int j = 1;j <= n;j++) dist[j] = min (dist[j],dist[t] + g[t][j]);
    }
    return dist[ed];
}
int main () {
    memset (g,0x3f,sizeof (g));
    cin >> n >> m >> st >> ed;
    while (m--) {
        int a,b,c;
        cin >> a >> b >> c;
        g[a][b] = g[b][a] = min (g[a][b],c);
    }
    int ans = dijkstra ();
    cout << ans << endl;
    return 0;
}

12 评论


用户头像
This_is_NTT   2023-09-09 11:14      1    踩      回复
#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 6210 * 2 + 10, INF = 0x3f3f3f3f;

struct Node {
    int y, v;
    Node(int _y, int _v) { y = _y, v = _v; };
};
vector<Node> edge[N];
int n, m, S, T, dist[N];
bool b[N];

inline void dijkstra(int s, int t) {
    memset(b, false, sizeof b);
    memset(dist, 0x3f, sizeof dist);
    dist[s] = 0;
    for (; ; ) {
        int x = -1;
        for (int i = 1; i <= n; i++)
            if (!b[i] && dist[i] < INF)
                if (x == -1 || dist[i] < dist[x])
                    x = i;
        if (x == t || x == -1)
            break;
        b[x] = true;
        for (auto i : edge[x])
            dist[i.y] = min(dist[i.y], dist[x] + i.v);
    }
    if (dist[t] < INF) 
        printf("%d\n", dist[t]);
    else
        printf("-1\n");
}

int main() {
    scanf("%d%d%d%d", &n, &m, &S, &T);
    for (int i = 1; i <= m; i++) {
        int x, y, z;
        scanf("%d%d%d", &x, &y, &z);
        edge[x].push_back(Node(y, z));
        edge[y].push_back(Node(x, z));
    }
    dijkstra(S, T);
    return 0;
}
用户头像
This_is_NTT   2023-09-09 11:14         踩      回复

这大概是最快的dij做法了

用户头像
incra   2023-09-09 17:17    回复了 This_is_NTT 的评论         踩      回复

不过可以卡,这种就卡你优化的策略


用户头像
吃饱了就来刷题   2023-10-23 21:26         踩      回复

有一个小问题,我找t的时候代码是

for(int i = 0;i < n;i ++){
    int t = -1, MIN = INF;
    for(int j = 1;j <= n;j ++){
        if(!vis[j] && dis[j] < MIN){
            t = j; MIN = dis[j]
        }
} 

逻辑是一样的,为什么这样就会出错啊(找单词distance最短的点的时候)

用户头像
incra   2023-10-24 17:20         踩      回复

是 WA 吗?

用户头像
吃饱了就来刷题   2023-10-24 18:14    回复了 incra 的评论         踩      回复

是的,其他的代码都没变,只要改动这里就会错

用户头像
incra   2023-10-24 21:21    回复了 吃饱了就来刷题 的评论         踩      回复

完整代码给我看看?


用户头像
兜里没有钢镚   2023-03-24 20:21         踩      回复

# 来了


用户头像
RandomLife   2022-11-12 08:36         踩      回复

长江后浪推前浪,一代更比一代浪
热浪传说:算法课
?????

用户头像
incra   2022-11-12 10:02         踩      回复

az


用户头像
xiuzhiyuan   2022-11-12 07:57         踩      回复

够努力。日积月累,必有所成。

用户头像
incra   2022-11-12 10:02         踩      回复

addddddddddddd


App 内打开
你确定删除吗?
1024
x

© 2018-2025 AcWing 版权所有  |  京ICP备2021015969号-2
用户协议  |  隐私政策  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标 qq图标
请输入绑定的邮箱地址
请输入注册信息