差分约束(就是把不等式转化为一个图,然后就可以做了,现在看来,我是很水的,我以前根本没有写过是spfa,然后我也煤油搞懂spfa的核心思想,)

来源:互联网 发布:王源sleep 知乎 编辑:程序博客网 时间:2024/03/29 17:37

差分约束,就是把题目中的信息转化为不等式,就是>=那种,不是的也是可以转化的,然后等式的化为负的,分为两个式子,我套一下模板,然后发现错了,这个时候的我茫然无措,不知道该从哪里查错误,然后问了一下大神,我发现大神的思维不仅快,而且,代码能力还是特别快的,我真是心悦诚服,还有我感觉自己的实践自己写代码的时间太少了,然后还有一位大佬,说应该自己写模板,不要一直依赖别人的模板,我觉得这话说的极是,好学校的学生就是不一样啊。

题目链接:点击打开链接

下面贴上大佬的代码:

#include <stdio.h>#include <algorithm>#include <vector>#include <string.h>#include <queue>using namespace std;const int N = 1005;typedef pair<int,int> edg;vector<edg>G[N];char s[5];void add(int a, int b, int c){    G[a].push_back(edg(b, c));}int dis[N], vis[N];bool spfa(int s, int n){    queue<int>q;    for(int i = 0; i <= n; ++i) dis[i] = 0x7ffffff, vis[i] = 0;    dis[s] = 0;    q.push(s); vis[s]++;    while(!q.empty()){        int u = q.front(); q.pop();        for(int k = 0; k < G[u].size(); ++k){            int v = G[u][k].first, w = G[u][k].second;            if(dis[v] > dis[u]+w){                dis[v] = dis[u]+w;                if(vis[v] > n) return 0;                else{                    vis[v]++; q.push(v);                }            }        }    }    return 1;}int main(int argc, const char * argv[]) {    int n, m;    while(scanf("%d%d", &n, &m) != EOF){        for(int i = 0; i <= n; ++i) G[i].clear();        int st = 0;        for(int i = 0; i < m; ++i){            scanf("%s", s);            if(s[0] == 'P'){                int a, b, c;                scanf("%d%d%d", &a, &b, &c);                add(a, b, -c);                add(b, a, c);            }            else{                int a, b;                scanf("%d%d", &a, &b);                add(a, b, -1);            }        }        for(int i = 1; i <= n; ++i){            add(st, i, -1);        }        if(spfa(st, n)) puts("Reliable");        else puts("Unreliable");    }    return 0;}

我觉得我应该多打几遍,然后记忆一下,


0 0