差分约束

一般 a-b>c、a-bc这样带有不等式的题目,可以建图+SPFA来写

SPFA模板:

//bfs最短路
bool spfa(int start, int n) {
    queue<int> que;
    for(int i=0;i<=n;i++){
        dis[i]=inf;
    }
    memset(vis, 0, sizeof(vis));
   // memset(cnt, 0, sizeof(cnt));
    dis[start] = 0, vis[start] = 1, cnt[start] = 1;
    que.push(start);
    while (que.size())
    {
        int x = que.front(); que.pop();
        vis[x] = 0;
        for (int i = head[x]; i; i = e[i].next)
        {
            int v = e[i].v;
            int w = e[i].w;
            if (dis[v] > dis[x] + w)
            {
                dis[v] = dis[x] + w;
                if (!vis[v]) {
                    vis[v] = 1;
                   // cnt[v]++;
                   // if (cnt[v] > n)return false;
                    que.push(v);
                }
            }
        }
    }
   // return true;
}

//dfs判断负环
bool spfa(int start, int n) {
    double dis[N];
    int cnt[N];
    int vis[N];
    stack<int> sta;
    memset(vis, 0, sizeof(vis));
    memset(cnt, 0, sizeof(cnt));
    for(int i=0;i<=n;i++)dis[i]=1e9;
    dis[start] = 0.0, vis[start] = 1, cnt[start] = 1;
    sta.push(start);
    while (sta.size())
    {
        int x = sta.top(); sta.pop();
        vis[x] = 0;
        for (int i = head[x]; i; i = e[i].next)
        {
            int v = e[i].v;
            double w = e[i].w;
            if (dis[v] > dis[x] + w)
            {
                dis[v] = dis[x] + w;
                if (!vis[v]) {
                    sta.push(v);
                    vis[v] = 1;
                    cnt[v]++;
                    if (cnt[v] > n)return false;
                }
            }
        }
    }
    return true;
}

bfs用来求距离。dfs只用来判断负环(会更快)

你可能感兴趣的:(图论)