第一次看这个题目,完全不知道怎么做,看起来又像是可以建个图进行搜索,但题目条件就给了你几个不等式,这是怎么个做法。。。之后google了下才知道还有个差分约束这样的东西,能够把不等式化成图,要求某个点在满足所有不等式的情况下的最大取值,只需对建好的图进行一次最短路即可

不过要使得a b 点满足这样 a<=b+k这种不等式,还得对题目所给的不等式进行下改装

原不等式无非就是 输入个 si ni,使得存在 A(si)+...A(si+ni)<k 或者 >k,我们新定义一个s[],s[i]代表从1 到 i的所有的点的和,这样,原不等式就会变成 s[si+ni]-s[si-1]>=k+1  或者 小于=k-1,进行下移项,即可变成差分约束不等式的形式,这样每个点的含义就是 对应的s[i]。

此外注意添加一个超级原点 N+1,跟所有点进行下连通,保证图的连通性。

其实题目还有个难点就是,他求是否能满足着m个不等式,如果不满足,意味着有相互冲突的不等式,也就是某个点值既可能正也可能负,也就是说图上存在负环。。。。这个转换确实比较难推敲,尤其是像我这种对图论题目还只是入门的菜鸟。

因此,建好图后,只需用SPFA遍历一下,判断有无负环即可。

此外,还有个疑惑,就是差分约束一定要有等于吗?就像上面的式子,如果不是为了满足=的条件,就不必用k+1和k-1来代替原来的k了。。。这个还有待考证

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#define N 250
using namespace std;
int u[N],v[N],w[N],nt[N],ft[N/],d[N/],num[N/],vis[N/];
int n,m,cnt,flag;
void addedge(int a,int b,int c)
{
u[cnt]=a;
v[cnt]=b;
w[cnt]=c;
nt[cnt]=ft[a];
ft[a]=cnt++;
}
void spfa()
{
int i,j;
for (i=;i<=n;i++)
d[i]=<<;
memset(num,,sizeof num);
memset(vis,,sizeof vis);
flag=;
d[n+]=;
queue <int> q;
q.push(n+);
vis[n+]=;
while (!q.empty())
{
int x=q.front();
q.pop();
vis[x]=;
num[x]++;
if (num[x]>n)
{
flag=;
return;
}
for (i=ft[x];i>=;i=nt[i])
{
int nx=v[i];
if (d[nx]>d[x]+w[i])
{
d[nx]=d[x]+w[i];
if (!vis[nx])
{
q.push(nx);
vis[nx]=;
}
}
}
} }
int main()
{
int i,j;
char ch[];
while (scanf("%d",&n))
{
if (!n) break;
cnt=;
scanf("%d",&m);
int a,b,k,si,ni;
memset(ft,-,sizeof ft);
for (i=;i<=m;i++)
{
scanf("%d%d%s%d",&si,&ni,ch,&k);
if (ch[]=='g')
{
addedge(si+ni,si-,(-k-));//用差分约束不等式建图,下同
}
else
{
addedge(si-,si+ni,k-);
}
}
for (i=;i<=n;i++) //将n+1作为超级原点进行连通。
addedge(n+,i,);
spfa();
if (flag)
{
puts("lamentable kingdom"); }
else puts("successful conspiracy");
}
return ;
}

UVA 515 差分约束 SPFA判负的更多相关文章

  1. BZOJ.4500.矩阵(差分约束 SPFA判负环 / 带权并查集)

    BZOJ 差分约束: 我是谁,差分约束是啥,这是哪 太真实了= = 插个广告:这里有差分约束详解. 记\(r_i\)为第\(i\)行整体加了多少的权值,\(c_i\)为第\(i\)列整体加了多少权值, ...

  2. POJ——1364King(差分约束SPFA判负环+前向星)

    King Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 11946   Accepted: 4365 Description ...

  3. POJ 1364 King (UVA 515) 差分约束

    http://poj.org/problem?id=1364 http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemi ...

  4. [luoguP1993] 小 K 的农场(差分约束 + spfa 判断负环)

    传送门 差分约束系统..找负环用spfa就行 ——代码 #include <cstdio> #include <cstring> #include <iostream&g ...

  5. UVA 558 Wormholes 【SPFA 判负环】

    题目链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_proble ...

  6. 洛谷P3275 [SCOI2011]糖果_差分约束_判负环

    Code: #include<cstdio> #include<queue> #include<algorithm> using namespace std; co ...

  7. poj 1364 King(线性差分约束+超级源点+spfa判负环)

    King Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 14791   Accepted: 5226 Description ...

  8. O - Layout(差分约束 + spfa)

    O - Layout(差分约束 + spfa) Like everyone else, cows like to stand close to their friends when queuing f ...

  9. POJ 3259 Wormholes(SPFA判负环)

    题目链接:http://poj.org/problem?id=3259 题目大意是给你n个点,m条双向边,w条负权单向边.问你是否有负环(虫洞). 这个就是spfa判负环的模版题,中间的cnt数组就是 ...

随机推荐

  1. 十一、SAP文本变量,并设置长度

    一.在SAP中,一个中文占用2个文本长度,详见代码: 二.效果如下

  2. 5. 支撑高并发,高可用,海量数据备份恢复的Redis重要性

    商品详情页的架构实现 缓存架构 第一块儿,要掌握的很好的,就是redis架构 高并发,高可用,海量数据,备份,随时可以恢复,缓存架构如果要支撑这些要点,首先呢,redis就得支撑 redis架构,每秒 ...

  3. 16 协程和www

    1.一个应用程序一般对应一个进程,一个进程一般有一个主线程,还有若干个辅助线程,线程之间是平行运行的,在线程里面可以开启协程,让程序在特定的时间内运行.2协程和线程的区别是:协程避免了无意义的调度,由 ...

  4. 十二、React 生命周期函数

    React生命周期函数: [官方文档]:https://reactjs.org/docs/react-component.html [定义]组件加载之前,组件加载完成,以及组件更新数据,组件销毁. 触 ...

  5. UVA - 11582 Colossal Fibonacci Numbers! (巨大的斐波那契数!)

    题意:输入两个非负整数a.b和正整数n(0<=a,b<264,1<=n<=1000),你的任务是计算f(ab)除以n的余数,f(0) = 0, f(1) = 1,且对于所有非负 ...

  6. 8 —— node —— 响应一切 html 需要的静态资源

      fs.readFile('.'+urls, function (err, data) {   res.end(data)   });

  7. JavaScript面试题(转)

    JS相关问题 数组去重 function uniq(array){ var temp = []; //一个新的临时数组 for(var i = 0; i < array.length; i++) ...

  8. UltraISO制作manjaro系统盘,使用优盘

    下载系统镜像 默认是清华镜像 刻入方式一定要选RAW方式

  9. 完美的代价(swap成回文串、贪心)

    Description 回文串,是一种特殊的字符串,它从左往右读和从右往左读是一样的.小龙龙认为回文串才是完美的. 现在给你一个串,它不一定是回文的,请你计算最少的交换次数使得该串变成一个完美的回文串 ...

  10. 吴裕雄--天生自然TensorFlow2教程:高阶操作

    import tensorflow as tf a = tf.random.normal([3, 3]) a mask = a > 0 mask # 为True元素,即>0的元素的索引 i ...