King(差分约束)
http://poj.org/problem?id=1364
题意真心看不大懂啊。。。
现在假设有一个这样的序列,S={a1,a2,a3,a4...ai...at}
其中ai=a*si,其实这句可以忽略不看
现在给出一个不等式,使得ai+a(i+1)+a(i+2)+...+a(i+n)<ki或者是ai+a(i+1)+a(i+2)+...+a(i+n)>ki
首先给出两个数分别代表S序列有多少个,有多少个不等式
不等式可以这样描述
给出四个参数第一个数i可以代表序列的第几项,然后给出n,这样前面两个数就可以描述为ai+a(i+1)+...a(i+n),即从i到n的连续和,再给出一个符号和一个ki
当符号为gt代表‘>’,符号为lt代表‘<'
那么样例可以表示
1 2 gt 0
a1+a2+a3>0
2 2 lt 2
a2+a3+a4<2
最后问你所有不等式是否都满足条件,若满足输出lamentable kingdom,不满足输出successful conspiracy,这里要注意了,不要搞反了
解题思路:一个典型的差分约束,很容易推出约束不等式
首先设Si=a1+a2+a3+...+ai
那么根据样例可以得出
S3-S0>0---->S0-S3<=-1
S4-S1<2---->S4-S1<=1
因为差分约束的条件是小于等于,所以我们将ki-1可以得到一个等于号
那么通式可以表示为
a b gt c
S[a-1]-s[a+b]<=-ki-1
a b lt c
S[a+b]-S[a-1]<=ki-1
那么根据差分约束建图,加入这些有向边
gt: <a+b,a-1>=-ki-1
lt: <a-1,a+b>=ki-1
再根据bellman_ford 或 SPAF 判断是否有无负环即可
若出现负环了则这个序列不满足所有的不等式
继续SPFA吧。。
这里用了无需建立超级源点的SPFA算法,在SPFA开始时将所有结点都放进队列,这样表示一开始和所有点都相连了,初始化dis数组为全0,相当于超级源点的边权值
总结:1、小于和小于等于关系的转化 2、超级源点的另一种建法
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
const int maxn = ; int n,m;
int cnt;
int p[maxn];
struct node
{
int u,v,w;
int next;
}edge[maxn]; void add(int u, int v, int w)
{
cnt++;
edge[cnt].u = u;
edge[cnt].v = v;
edge[cnt].w = w;
edge[cnt].next = p[u];
p[u] = cnt;
}
//无需建立超级源点的SPFA
int SPFA()
{
queue<int> que;
while(!que.empty())
que.pop();
int dis[maxn],vexcnt[maxn];
bool inque[maxn];
memset(dis,,sizeof(dis));//dis全部初始化为0,
memset(inque,true,sizeof(inque));//inque全部初始化为1
memset(vexcnt,,sizeof(vexcnt)); for(int i = ; i <= n; i++)
que.push(i);//先让所有节点进队列
while(!que.empty())
{
int u = que.front();
que.pop();
inque[u] = false; for(int i = p[u]; i; i = edge[i].next)
{
if(dis[edge[i].v] > dis[u] + edge[i].w)
{
dis[edge[i].v] = dis[u] + edge[i].w;
if(!inque[edge[i].v])
{
inque[edge[i].v] = true;
que.push(edge[i].v);
vexcnt[edge[i].v]++;
if(vexcnt[edge[i].v] > n)//进队超过n次说明有负环
return ;
}
}
}
}
return ;
} int main()
{
while(~scanf("%d",&n) && n)
{
scanf("%d",&m);
int a,b,w;
char str[];
cnt = ;
memset(p,,sizeof(p));
for(int i = ; i < m; i++)
{
scanf("%d %d %s %d",&a,&b,str,&w);
if(strcmp(str,"gt") == )
add(a+b,a-,-w-);//加边
else add(a-,a+b,w-);//加边,均将不等式转化为 <=,
}
if(SPFA()) printf("lamentable kingdom\n");
else printf("successful conspiracy\n"); }
return ;
}
其实Bellman_ford 比SPFA更快点,普通的Bellman_ford,记得要松弛 n次。
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
const int maxn = ; int n,m;
int cnt;
struct node
{
int u,v,w;
}edge[maxn]; void add(int u, int v, int w)
{
edge[cnt].u = u;
edge[cnt].v = v;
edge[cnt].w = w;
cnt++;
}
int bellman_ford()
{
int dis[maxn];
memset(dis,,sizeof(dis)); for(int i = ; i <= n; i++)
{
for(int j = ; j < m; j++)
{
if(dis[edge[j].v] > dis[edge[j].u] + edge[j].w)
dis[edge[j].v] = dis[edge[j].u] + edge[j].w;
}
}
for(int j = ; j < m; j++)
{
if(dis[edge[j].v] > dis[edge[j].u] + edge[j].w)
return ;
}
return ;
}
int main()
{
while(~scanf("%d",&n) && n)
{
scanf("%d",&m);
int a,b,w;
char str[];
cnt = ;
for(int i = ; i < m; i++)
{
scanf("%d %d %s %d",&a,&b,str,&w);
if(strcmp(str,"gt") == )
add(a+b,a-,-w-);//加边
else add(a-,a+b,w-);//加边,均将不等式转化为 <=,
}
if(bellman_ford())
printf("lamentable kingdom\n");
else printf("successful conspiracy\n");
}
return ;
}
King(差分约束)的更多相关文章
- POJ 1364 King --差分约束第一题
题意:求给定的一组不等式是否有解,不等式要么是:SUM(Xi) (a<=i<=b) > k (1) 要么是 SUM(Xi) (a<=i<=b) < k (2) 分析 ...
- [poj 1364]King[差分约束详解(续篇)][超级源点][SPFA][Bellman-Ford]
题意 有n个数的序列, 下标为[1.. N ], 限制条件为: 下标从 si 到 si+ni 的项求和 < 或 > ki. 一共有m个限制条件. 问是否存在满足条件的序列. 思路 转化为差 ...
- King 差分约束 判负环
给出n个不等式 给出四个参数第一个数i可以代表序列的第几项,然后给出n,这样前面两个数就可以描述为ai+a(i+1)+...a(i+n),即从i到n的连续和,再给出一个符号和一个ki当符号为gt代表‘ ...
- UVALive 5532 King(差分约束,spfa)
题意:假设一个序列S有n个元素,现在有一堆约束,限制在某些连续子序列之和上,分别有符号>和<.问序列S是否存在?(看题意都看了半小时了!) 注意所给的形式是(a,b,c,d),表示:区间之 ...
- poj 1364 King(差分约束)
题目:http://poj.org/problem?id=1364 #include <iostream> #include <cstdio> #include <cst ...
- King(差分约束)
http://poj.org/problem?id=1364 题意:输入i,n,gt(lt),k; 判断是否存在这样一个序列,从第 i 项加到第 n+i 项的和 <(lt) k 或 >(g ...
- 【转】最短路&差分约束题集
转自:http://blog.csdn.net/shahdza/article/details/7779273 最短路 [HDU] 1548 A strange lift基础最短路(或bfs)★254 ...
- 转载 - 最短路&差分约束题集
出处:http://blog.csdn.net/shahdza/article/details/7779273 最短路 [HDU] 1548 A strange lift基础最短路(或bfs)★ ...
- POJ 1364 King (差分约束)
King Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 8660 Accepted: 3263 Description ...
- hdu 1531 king(差分约束)
King Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
随机推荐
- 20151211Jquery Ajax进阶学习笔记
四.JSON 和 JSONP 如果在同一个域下,$.ajax()方法只要设置 dataType 属性即可加载 JSON 文件.而在非 同域下,可以使用 JSONP,但也是有条件的. //$.ajax( ...
- thinkphp 模板中赋值
在项目开发的时候,有时候希望直接在模板中调用 一些自定义方法,或者内置方法来,处理获得一些数据,并且赋值给一个变量给后面调用,这个时候如果用原生Php 的方式调用如下:<?php $abc = ...
- 关于C++几个容易混淆的概念总结
1.函数指针和指针函数 函数指针说的就是一个指针,但这个指针指向的函数,不是普通的基本数据类型或者类对象.函数指针的定义: int (*func)(int a, int b); // 声明函数指针 指 ...
- 【技术·水】浅谈Dism++清理插件开发
前言 昨天我发布了NCleaner,一款Dism++清理插件(地址:http://bbs.pcbeta.com/viewthread-1692182-1-1.html) 有些人想要我开源NCleane ...
- Launch a Batch File With Windows Installer
Quote from: http://flexerasoftware.force.com/articles/en_US/HOWTO/Q111515 Synopsis This article desc ...
- c语言中继承和多态的简单实现
C语言本身是不支持继承和多态的,但其实在 C 的世界里,有一套非常有名的面向对象的框架,用的也非常广,那就是 GObject,它是整个图形界面开发库 GTK 的基石,在IBM developerWor ...
- gcc命令以及makefile文件
(一)makefile里涉及到的gcc命令 gcc -I./inc:指定头文件寻找目录 将按照 ./inc --> /usr/include --> /usr/local/include的 ...
- bootstrap Tooltip换行问题
bootstrap自身带有tooltip,使用起来很方便,但是美中不足,它的tooltip并不支持换行. 比如我们通过<textarea>输入框传入到数据库的长文本,文本是带有换行符的,但 ...
- c#NPOI导出
按行列导出数据: HSSFWorkbook hssfworkbook = new HSSFWorkbook(); //命名空间:using NPOI.HSSF.UserModel; Sheet she ...
- React新接触
html5页面的开始引入: <script src="../build/react.js"></script> <!--核心库--> < ...