玄关求调MLE代码

P1396 营救

[评测记录](https://www.luogu.com.cn/record/137963551)
by Y_QWQ_Y @ 2023-12-03 10:27:37


@[Y_QWQ_Y](/user/677091) ```cpp #include <bits/stdc++.h> #define ll long long using namespace std; int n, m, s, t, c, h[30001], vis[30001], dis[30001]; priority_queue<pair<int, int>> q; struct Edge{int nxt, dis, to;}e[30001]; void add (ll from, ll to, ll dis) { e[++ c].nxt = h[from]; e[c].dis = to; e[c].to = dis; h[from] = c; } signed main() { scanf ("%d %d %d %d", &n, &m, &s, &t); for (int i = 0; i < m; ++ i) { int u, v, d; scanf ("%d %d %d", &u, &v, &d); add (u, v, d); add (v, u, d); } memset(dis, 0x3f, sizeof(dis)); memset(vis, 0, sizeof(vis)); dis[s] = 0; q.push(make_pair(0, s)); while(!q.empty()) { int x = q.top().second; q.pop(); if(vis[x]) continue; vis[x] = 1; for(int i = h[x]; i; i = e[i].nxt) { int k = max(dis[x], e[i].to), r = e[i].dis; if(k < dis[r]){ dis[r] = k; q.push(make_pair(-dis[r], r)); } } } printf ("%d", dis[t]); return 0; } ```
by zheng_zx @ 2023-12-03 11:17:00


如果我没有看错的话,你的解法是这样的: 使用链式向前星存储边,并用数组模拟链表; 输入每条边,按无向图处理; 进行 DFS,搜索每个点联通的所有其它的点,直到达到终点; 到达终点时刷新答案; 输出答案; 首先你这个程序有以下几点可以优化: 1. 鉴于输入数据规模不小,可以考虑使用快读 2. 题目“输入格式”中有提到,两个区之间可能存在多条大道,那么我们只需要存储其中拥挤度最小的一条即可,这点可以将链式向前星改成邻接表来方便实现,能够大大降低时间复杂度,能得 40 pts 但是就算把这些优化全部加上也通过不了这一题,我们只能换策略 可用的策略有以下这些: 1. 使用最小生成树(Prim 或 Kruskal 均可)的思想来解决这道题 2. 使用非常玄学的 SPFA 再加上各种优化来解决这道题 3. 使用 Dijkstra + 堆优化来解决这道题 我个人比较推荐最小生成树,因为好理解也好写 我相信你至少会一个()
by masonxiong @ 2023-12-03 19:09:42


恭喜你猜错了,我都不会,dijkstra还在学,kruskal,spfa都不会 ~~本人,卒~~
by Y_QWQ_Y @ 2023-12-03 20:26:30


|