萌新求助最短路

灌水区

听取MLE声一片 @ 2020-09-27 21:59:04

Rt,最短路核心思想肯定是熟悉的,蒟蒻想知道如何迅速掌握最短路(以前写的比较少,都是看模板,求教大佬!

顺便求一下用vector建图的SPFA和dij

注:本帖最好不要出现无意义回复


by FutureThx @ 2020-09-27 22:01:05

核心思想都熟悉了,不看模板自己乱打也可以了吧?(另:这个为啥要发灌水)


by 听取MLE声一片 @ 2020-09-27 22:05:47

@Ymw123 乱打打不出来


by 听取MLE声一片 @ 2020-09-27 22:06:08

以后不发灌水了,沉得那么快


by Stay_Hungry @ 2020-09-27 22:07:56

@听取MLE声一片
我提供一种比较舒服的写法:

vector<int> ev[N], ew[N];
void ins(int u, int v, int w) {
    ev[u].push_back(v);
    ew[u].push_back(w);
}
void solution(int p) {
    queue<int> q;
    memset(s, 0x3f, sizeof s);
    s[p] = 0;
    while(!q.empty()) {
        int u = q.front(); q.pop();
        for(int i = 0; i < ev[u].size(); ++i) {
            int v = ev[u][i], w = ew[u][i];
            if(s[v] > s[u] + w) {
                s[v] = s[u] + w;
                q.push(v);
            }
        }
    }
} // SPFA
#define pii pair<int, int>
void solution(int p) {
    priority_queue< pii, vector< pii >, greater< pii > > q;
    memset(s, 0x3f, sizeof s);
    s[p] = 0;
    while(!q.empty()) {
        int u = q.top().second; q.pop();
        for(int i = 0; i < ev[u].size(); ++i) {
            int v = ev[u][i], w = ew[u][i];
            if(s[v] > s[u] + w) {
                s[v] = s[u] + w;
                q.push(make_pair(s[v], v));
            }
        }
    }
} // dij

by Shiroko @ 2020-09-27 22:08:42

@听取MLE声一片 个人感觉dij和spfa都挺好记的

不过还是上手多打几题才能更好掌握吧

要记就一定要记带优化的 不然以后再想自己在源代码上加优化就晚了(


by SIXIANG32 @ 2020-09-27 22:09:39

@听取MLE声一片 理解原理,多打几遍,就背下来了


by monstersqwq @ 2020-09-27 22:10:36

u1s1这东西我每次打的都不一样,理解了原理就随便写了


by Sktic @ 2020-09-27 22:10:37

先理解原理,然后刷题,尽量不要看模板做,多做就背出来了


by 听取MLE声一片 @ 2020-09-27 22:13:02

谢谢大佬!


|