POJ 1364 King(差分约束系统)
http://poj.org/problem?id=1364
题意:
有一个数字序列S={a1,a2,…an},它有m个子序列为 Si={a[si], a[si+1], a[si+2], … a[si+ni] }. 现在给出m个限制形式条件如下:
第i个子序列的和 <(or>) ki 的值.
问你是否存在这么一个S整数序列?
分析:
我们令S[i]= a1+a2+..+ai. 所以对于每一条约束条件比如:
a[si]+a[si+1]+…+a[si+ni]< ki . 我们可以转化为 S[si+ni] – S[si-1] <= ki-1.
这样就可以转化为了差分约束系统了.
该系统具有点的集合为0, 1,… n.其中对于S[si+ni] – S[si-1] <= ki-1条件我们可以得到
si-1 到 si+ni
的权值为ki-1的边.
对于a[si]+a[si+1]+…+a[si+ni] >ki 即 S[si+ni] – S[si-1] >=ki+1 我们可以得到
si+ni 到 si-1
的权值为-ki-1 的边.
然后由于是判断差分约束系统是否有解问题,我们还需要虚构一个超级源n+1号点.使得从n+1号点有边出来到0,1,…n号点且权值为0. 这样然后用BellmanFord算法即可判断是否有负权环了.
AC代码:
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#define INF 1e9
using namespace std;
const int maxn=100+10;
const int maxm=10000+10;
struct Edge
{
int from,to,dist;
Edge(){}
Edge(int f,int t,int d):from(f),to(t),dist(d){}
};
struct BellmanFord
{
int n,m;
int head[maxn],next[maxm];
Edge edges[maxm];
int d[maxn];
bool inq[maxn];
int cnt[maxn];
void init(int n)
{
this->n=n;
m=0;
memset(head,-1,sizeof(head));
}
void AddEdge(int from,int to,int dist)
{
edges[m]=Edge(from,to,dist);
next[m]=head[from];
head[from]=m++;
}
bool bellmanford()
{
memset(inq,0,sizeof(inq));
memset(cnt,0,sizeof(inq));
queue<int> Q;
for(int i=0;i<n;i++) d[i]= i==n-1?0:INF;
Q.push(n-1);
while(!Q.empty())
{
int u=Q.front(); Q.pop();
inq[u]=false;
for(int i=head[u];i!=-1;i=next[i])
{
Edge &e=edges[i];
if(d[e.to] > d[u]+e.dist)
{
d[e.to] = d[u]+e.dist;
if(!inq[e.to])
{
inq[e.to]=true;
Q.push(e.to);
if(++cnt[e.to]>n) return true;
}
}
}
}
return false;
}
}BF;
int main()
{
int n,m;
while(scanf("%d",&n)==1&&n)
{
scanf("%d",&m);
BF.init(n+2);
while(m--)
{
int si,ni,ki;
char str[10];
scanf("%d%d%s%d",&si,&ni,str,&ki);
if(str[0]=='l') BF.AddEdge(si-1,si+ni,ki-1);
else if(str[0]=='g') BF.AddEdge(si+ni,si-1,-ki-1);
}
for(int i=0;i<=n;i++) //超级源到其他所有点的边
BF.AddEdge(n+1,i,0);
printf("%s\n",BF.bellmanford()?"successful conspiracy":"lamentable kingdom");
}
return 0;
}
分享到:
相关推荐
POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类
北大POJ2983-Is the Information Reliable【差分约束+优化Bellman】 解题报告+AC代码
poj分类poj分类poj分类poj分类
poj 百练 题目分类 poj 百练 题目分类
POJ题目分类POJ题目分类POJ题目分类
POJ题解及题目分类,共150道左右。C/C++
该文档对poj大部分题目进行了分类,有利于喜欢在poj刷题的朋友
pojACM题目分类,便于各类型同学分别做题有所参考
poj题目分类
poj上的算法题目分类,对于大家想练习算法的同鞋可以参考一下,里面按类列出了各种算法的题号。
poj800多道题目的详细分类,比较具体,比网上的好多了值得下载。
POJ题目分类,列出了所有的类目,里面写了一些很好的框架。
poj题目分类打包 acm北大的题库题目分类 来源网络 网络还有自己整理一部分。好久前的玩意了
poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题...
强大的poj分类 学做POJ必备 非最新,供参考
史上最全poj题目分类及原题 包括:基本算法:贪心、递归、递推、枚举;基本数据结构,链表、栈;动态规划;搜索;高级数据结构:二叉搜索树、线段树、树状数组;数学:数论
这是关于 ACM程序设计 POj系统 题目的 一些题目分类的 希望对大家有用!
关于poj dp分类,我一直寻找dp的分类,终于找到了,也上传一下
poj 1000 - 2000 部分题目 官方分类 poj 1000 - 2000 部分题目 官方分类
史上最全poj题目分类(159页).pdf