差分约束,就是把题目中的信息转化为不等式,就是>=那种,不是的也是可以转化的,然后等式的化为负的,分为两个式子,我套一下模板,然后发现错了,这个时候的我茫然无措,不知道该从哪里查错误,然后问了一下大神,我发现大神的思维不仅快,而且,代码能力还是特别快的,我真是心悦诚服,还有我感觉自己的实践自己写代码的时间太少了,然后还有一位大佬,说应该自己写模板,不要一直依赖别人的模板,我觉得这话说的极是,好学校的学生就是不一样啊。
题目链接:点击打开链接
下面贴上大佬的代码:
#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;
}
我觉得我应该多打几遍,然后记忆一下,
本文通过实例解析了差分约束算法的应用,介绍了如何将题目条件转化为不等式,并使用SPFA算法进行求解。附带提供了完整的代码实现,强调了自主编写模板的重要性。

被折叠的 条评论
为什么被折叠?



