poj1364King
来源:互联网 发布:网络层传输的数据单位 编辑:程序博客网 时间:2024/05/18 03:06
题目大意:
有一个序列S={a1 ,a2 ........an}, 现在告诉你许多区间从第i个元素到第i+n个元素的和的范围是大于K或者小于K,问你这些条件是否能够同时满足。
解题思路:
这是我所做的第一道差分约束的题目,以前看差分约束的时候看到那张矩阵连乘的图就不想看下去了(线代学的不好)
后来才知道与那个没什么毛线关系啊,其实就是给出m个关于n个元素的关系式,然后求解吗。。。。求解的方法是构造出不等式组(高中学过吧。。。。)然后求解,其实这个可以用最短路来求哦。。。。
就拿这道题来说吧,不等式组是。。。
假设Si=a1+a2+...ai
{
s(i+n) - s(i-1)<K
s(i+n) - s(i-1)>K
}
==>
{
s(i+n)-s(i-1)<=k-1;
s(i-1)-s(i+n)<=-k-1;
}
......然后构造图。。。
链式前向星。。。。。。。
#include<stdio.h>#include<queue>using namespace std;const int N = 109;int n,m;struct node{ int to; int dis; int next;};int head[N],h;node edg[N];void add(int a,int b,int d){ edg[h].to=b; edg[h].dis=d; edg[h].next=head[a]; head[a]=h; h++;}bool in_q[N];int cnt[N],dis[N];queue<int>q;int spfa(){ int cur,k,v; while(!q.empty()) { cur=q.front(); q.pop(); in_q[cur]=false; for(k=head[cur];k!=-1;k=edg[k].next) { v=edg[k].to; if(dis[v]>dis[cur]+edg[k].dis) { dis[v]=dis[cur]+edg[k].dis; if(!in_q[v]) { q.push(v); in_q[v]==true; cnt[v]++; if(cnt[v]>n) return 0;//需要清空队列的真正原因。。。。 } } } } return 1;}void init(){ int i; for(i=0;i<=n;i++) { head[i]=-1; dis[i]=0;//既然只要判断其是否有负环的话。。。 in_q[i]=false; cnt[i]=0; } h=0; while(!q.empty())//忘了讲队列清空了,我去。。。。 q.pop();}int main(){ char buf[10]; int i,u,v,d; while(scanf("%d",&n)&&n) { scanf("%d",&m); init(); for(i=0;i<m;i++) { scanf("%d%d%s %d",&u,&v,buf,&d); if(buf[0]=='g'){ add(u+v,u-1,-d-1); q.push(u+v); } else{ add(u-1,u+v,d-1); q.push(u-1); } } if(spfa()) puts("lamentable kingdom"); else puts("successful conspiracy"); }}
0 0
- poj1364King
- POJ1364King差分约束
- poj1364King(差分约束系统,判负环)
- GNU Emacs Manual 24.3 第二章
- HttpUrlConnection的GET请求和POST请求
- 用友一体化资金管控方案助大企业集团增效
- Firefox 火狐浏览器无法安装firebug 解决办法
- VLC笔记 之 荔枝记
- poj1364King
- POJ 3130 How I Mathematician Wonder What You Are!(半平面交)
- hdu 4099 字典树 + 斐波那契
- Linux 下zip、unzip解压缩命令用法
- Qt移动应用开发(三):使用精灵图片实现帧动画
- asdf
- busybox配置telnetd
- 计算机视觉、机器学习相关领域论文和源代码大集合
- grunt 用法小结