[poj 1364]King[差分约束详解(续篇)][超级源点][SPFA][Bellman-Ford]
题意
有n个数的序列, 下标为[1.. N ], 限制条件为: 下标从 si 到 si+ni 的项求和 < 或 > ki. 一共有m个限制条件. 问是否存在满足条件的序列.
思路
转化为差分约束, 就是
即 Si 为第 i 项的前缀和, 特别的 So 为0. 转化不等式(连续子段和变为前缀和之差 > < 变为 >= <= ),求最短路, 判断有没有负权回路.
注意
由于并不知道图是否连通
(不像是之前的那道Candies图一定是联通的,选择班长所代表的点即可)
所以正常情况下是要另设一个"超级源点", 连接图上的每个点, 从这个点出发就一定可以遍历到每一个点.
"超级源点"到每个点的边权是任意的,而它自己的点权自然是0.
这样的话,就求出了一组满足每对点的差尽可能大, 并且其中的d[0] = 0的解.
1. 将所有点(包括"超级源点")同时平移, 均为满足所有约束的可行解(包括新加入的边权们)
2. 将原图中的所有点同时平移, 得到所有满足原有约束的可行解. 但是仍有d[0] = 0的此时, 与超级源点的这些约束有可能不满足. 但是显然这是无所谓的.
3. 由此可知, 超级源点的作用就在于确保图的连通性,使得每一个点都有一个"距离". 而"超级源点"带来的额外约束一是d[0] = 0, 二是新加的边权. 二者影响的都是d[1]到d[n]的浮动情况(d[0]是参考零点, 额外的边权约束则是起到了限制d[1]到d[n]与d[0]的距离的作用,一堆不等式同样是选择了限制最严的那些并且距离尽可能大....没有实际意义...)
总之参考零点就是这样~
但是用SPFA只是判断负环的话,只需要初始时将所有点入队(而非只将源点入队), 然后判断每个点的入队次数. 如果超过点的总数, 说明存在负环.否则不存在.
数值上是从INF开始减, 有负环的话就会一直减... 没有的话就会正常退出, 当然这个时候d[ ] 值会很大..
SFPA + stack
//132K 16MS
#include <cstdio>
#include <cstring>
#include <stack>
using namespace std;
const int MAXN = 105;
const int MAXE = 105;
const int INF = 0x3f3f3f3f;
struct pool
{
int v,pre,w;
} p[MAXE];
int num,head[MAXN],d[MAXN],n,m,enq[MAXN];
bool inq[MAXN];
stack<int> s;
void clear()
{
while(!s.empty()) s.pop();
memset(head,0,sizeof(head));
memset(d,0x3f,sizeof(d));
memset(inq,false,sizeof(inq));
memset(enq,0,sizeof(enq));
num = 0;
} bool SPFA()
{
for(int i=0;i<=n;i++)
{
s.push(i);
inq[i] = true;
enq[i]++;
}
d[0] = 0;
while(!s.empty())
{
int u = s.top();
s.pop();
inq[u] = false;
for(int tmp=head[u],v;v=p[tmp].v,tmp;tmp=p[tmp].pre)
{
int w = p[tmp].w;
if(d[v]>d[u]+w)
{
d[v] = d[u] + w;
if(!inq[v])
{
inq[v] = true;
enq[v]++;
if(enq[v]>n+1) return false;
s.push(v);
}
}
}
}
return true;
} void add(int u, int v ,int w)
{
p[++num].v = v;
p[num].w = w;
p[num].pre = head[u];
head[u] = num;
} int main()
{
while(scanf("%d",&n)==1 && n)
{
clear();
scanf("%d",&m);
while(m--)
{
int si,ni,ki;
char o,p;
scanf("%d %d %c%c %d",&si,&ni,&o,&p,&ki);
if(o=='g') add(si+ni,si-1,-ki-1);
else add(si-1,si+ni,ki-1);
}
printf(SPFA()?"lamentable kingdom\n":"successful conspiracy\n");
}
}
用Bellman-Ford也可以.这个时候就要用到超级源点啦
//120K 0MS
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = 105;
const int MAXE = 210;
const int INF = 0x3f3f3f3f;
int s[MAXE],e[MAXE],w[MAXE];
int num,d[MAXN],n,m; void clear()
{
memset(d,0x3f,sizeof(d));
num = 0;
} bool Bellman_Ford()
{
d[n+1] = 0;
for(int i=0;i<=n+1;i++)
{
for(int j=1;j<=num;j++)
{
if(d[e[j]]>d[s[j]]+w[j]) d[e[j]] = d[s[j]] + w[j];
}
}
for(int j=1;j<=num;j++)
{
if(d[e[j]]>d[s[j]]+w[j]) return false;
}
return true;
} void add(int u, int v ,int c)
{
s[++num] = u;
e[num] = v;
w[num] = c;
} int main()
{
while(scanf("%d",&n)==1 && n)
{
clear();
scanf("%d",&m);
while(m--)
{
int si,ni,ki;
char o,p;
scanf("%d %d %c%c %d",&si,&ni,&o,&p,&ki);
if(o=='g') add(si+ni,si-1,-ki-1);
else add(si-1,si+ni,ki-1);
}
for(int i=0;i<=n;i++)
{
add(n+1,i,0);
}
printf(Bellman_Ford()?"lamentable kingdom\n":"successful conspiracy\n");
}
}
[poj 1364]King[差分约束详解(续篇)][超级源点][SPFA][Bellman-Ford]的更多相关文章
- POJ 1364 King --差分约束第一题
题意:求给定的一组不等式是否有解,不等式要么是:SUM(Xi) (a<=i<=b) > k (1) 要么是 SUM(Xi) (a<=i<=b) < k (2) 分析 ...
- [poj 3159]Candies[差分约束详解][朴素的考虑法]
题意 编号为 1..N 的人, 每人有一个数; 需要满足 dj - di <= c 求1号的数与N号的数的最大差值.(略坑: 1 一定要比 N 大的...difference...不是" ...
- poj 1364 King(差分约束)
题目:http://poj.org/problem?id=1364 #include <iostream> #include <cstdio> #include <cst ...
- 差分约束详解&&洛谷SCOI2011糖果题解
差分约束系统: 如果一个系统由n个变量和m个约束条件组成,形成m个形如ai-aj≤k的不等式(i,j∈[1,n],k为常数),则称其为差分约束系统(system of difference const ...
- POJ 3169 Layout(差分约束+链式前向星+SPFA)
描述 Like everyone else, cows like to stand close to their friends when queuing for feed. FJ has N (2 ...
- 1_03_MSSQL课程_约束详解
复习: ->创建数据库的SQL:******** create database 数据库名 on ( name=‘’, size=5MB, filegrowth=2MB, filename=&q ...
- POJ 1364 King (UVA 515) 差分约束
http://poj.org/problem?id=1364 http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemi ...
- poj 1364 King(差分约束)
题意(真坑):傻国王只会求和,以及比较大小.阴谋家们想推翻他,于是想坑他,上交了一串长度为n的序列a[1],a[2]...a[n],国王作出m条形如(a[si]+a[si+1]+...+a[si+ni ...
- POJ 1364 King (差分约束)
King Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 8660 Accepted: 3263 Description ...
随机推荐
- JAXB--学习2
一.Jaxb处理java对象和xml之间转换常用的annotation有: @XmlType @XmlElement @XmlRootElement @XmlAttribute @XmlAccesso ...
- 【微信H5支付】微信公众号里H5网页点击调取微信支付
最近在公众号里开发了下单支付H5网页,需要在H5里调用微信支付界面.开发思路和代码整理如下: todo...
- referer报头
依据客户的到达方式定制页面 referer报头保存了用户是从哪个网站找到到这里来的信息的.如果用户直接输入了页面的地址,浏览器就不会发送referer信息. 5.6.1 创建一个可以根据链接过来的网站 ...
- 深入解读ESB与SOA的关系
时至今日,SOA的概念渐渐清晰了. 有关ESB的概念,已经吵了好多年了,还是没有定论. 我个人认为,ESB本来就是抽象的概念,而且内涵丰富,在不同的场合含义不同.因此应该从不同的角度来认识. ...
- POJ 2697 A Board Game (bfs模拟)
比较水的一道题,在4*4的棋盘上有黑白子,现在有某种移动方式,问能否通过它将棋盘从某个状态移动到另一种状态 只要想好怎么保存hash表来去重,其他就差不多了... #include <iostr ...
- Java基础知识强化46:StringBuffer类之判断一个字符串是否对称案例
1. 分析:判断一个字符串是否是一个对称的字符串,我们只需要把字符串的第1个字符和最后1个字符,第2个字符和倒数第2个字符,…… 比较的次数是长度除以2. 方法1:通过取取索引对应值来进行一一比对 ...
- Slider( 滑动条) 组件
本节课重点了解 EasyUI 中 Slider(滑动条)组件的使用方法,这个组件依赖于Draggable(拖动)组件. 一. 加载方式//class 加载方式<input class=" ...
- 新Android学习计划
最近,在学习Android Design Support Library提供的新控件过程中,我感受到了原来的学习方式的缺点: 学习内容过于随意,在工作过程中碰到的新问题都想去掌握,心血来潮就想写一篇相 ...
- Oracle Enterprise Manager快速重建
我们在使用Oracle时, 可以利用Oracle自带的EM(Enterprise Manager)来更方便的管理我们的数据库.但是有时候我们的em却有时候无法连接,造成这个问题的原因有好多,例如没有正 ...
- [Jquery] 操作html 不常用元素方法大全
除http://www.w3school.com.cn/jquery/jquery_selectors.asp上的以外该大全应都有. 第一章 input控件篇 1.操作select 下拉框 1.1 获 ...