最基础的图论算法

版权声明:转载请联系QQ:1810647785 https://blog.csdn.net/weixin_42619451/article/details/82154207

D i j k s t r a + 堆优化

struct edge {
    int next, to, v;
}e[500010];

int cnt;
int head[maxn];

inline void add(int u, int v, int w) {
    e[++cnt].next = head[u];
    head[u] = cnt;
    e[cnt].to = v;
    e[cnt].v = w;
}

int n, m, s;
int dis[maxn];

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

inline int dij() {
    for(re int i = 1; i <= n; i++) {
        dis[i] = INF;
    }
    dis[s] = 0;
    priority_queue<node> Q;
    Q.push((node){s, 0});
    while(!Q.empty()) {
        node fr = Q.top();
        Q.pop();
        int u = fr.u, d = fr.d;
        if(d != dis[u]) {
            continue;
        }
        for(re int i = head[u]; i; i = e[i].next) {
            int v = e[i].to, w = e[i].v;
            if(dis[u] + w < dis[v]) {
                dis[v] = dis[u] + w;
                Q.push((node){v, dis[v]});
            }
        }
    }
}

S P F A

struct E {
    int nxt, to, val;
}e[500010];

int cnt, head[maxn];

inline void add(int u, int v, int w) {
    e[++cnt] = (E) {head[u], v, w};
    head[u] = cnt;
}

int n, s, dis[maxn], vis[maxn], q[maxn];

inline void spfa() {
    memset(dis, INF, sizeof(dis));
    memset(vis, 0, sizeof(vis));
    queue<int> Q;
    dis[s] = 0;
    Q.push(s);
    while(!Q.empty()) {
        int u = Q.front();
        Q.pop();
        vis[u] = 0;
        for(int i = head[u]; i; i = e[i].nxt) {
            int v = e[i].to;
            if(dis[v] == INF || dis[v] > dis[u] + e[i].val) {
                dis[v] = dis[u] + e[i].val;
                if(!vis[v]) {
                    vis[v] = 1;
                    Q.push(v);
                }
            }
        }
    }
} 

猜你喜欢

转载自blog.csdn.net/weixin_42619451/article/details/82154207