poj1364(King)
来源:互联网 发布:java中两个list合并 编辑:程序博客网 时间:2024/05/01 21:20
题目链接:http://poj.org/problem?id=1364
题意:给出n个变量,m个约束公式 asi + asi+1 + .... + asi+ni < ki or > ki ,叫你判断是否存在着解满足这m组约束公式。
分析:asi + asi+1 + ....... + asi + n < ki or > ki,因为ai和ki都为整,设sum[n] 为 变量ai的前n个和,则可以转化为 sum[si+n] - sum[si-1] <= ki -1 or sum[si-1] - sum[si+n] <= -1-ki ,这样问题就转化为差分约束的情况,可以差用Bellman-Ford算法进行求解。
代码:
#include<stdio.h>#include<string.h>struct Edge{int u;int v;int w;}edge[105];int dis[105];int n,m,p;int si,ni,ki;char oi[3];int Bellman_ford(){int i,j; memset(dis,0,sizeof(dis));for(i=1;i<=n;i++)//引入源点0之后有n+1个点了,最多松弛n次for(j=0;j<p;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(i=0;i<p;i++)//如果第n+1还可以松弛,则说明存在负权环,即不存在这样的序列 if(dis[edge[i].v]>dis[edge[i].u]+edge[i].w) return 1; return 0;}int main(){int i;while(scanf("%d",&n) && n!=0){p=0;scanf("%d",&m); for(i=0;i<m;i++){scanf("%d%d%s%d",&si,&ni,oi,&ki);if(oi[0]-'l' == 0){edge[p].u=si-1;edge[p].v=si+ni;edge[p].w=ki-1;p++;}else { edge[p].u=si+ni;edge[p].v=si-1;edge[p].w=-ki-1;p++;}}if(Bellman_ford())printf("successful conspiracy\n");else printf("lamentable kingdom\n");}return 0;}
- POJ1364 King
- poj1364(King)
- poj1364 - King
- poj1364 King
- poj1364 King
- Poj1364 King
- POJ1364 King
- 【POJ1364】King
- poj1364 King
- POJ1364 KING
- POJ1364 King
- POJ1364[king]
- ZOJ1260 POJ1364 HDU1531 King
- [POJ1364] 国王king
- poj1364 King --- 差分约束
- POJ1364 King 【差分约束】
- POJ1364[King]--差分约束
- POJ1364 King(差分约束+Spfa)
- 备份恢复5——rman增量累积备份+catalog和nocatalog
- MyEclipse Subscription code生成器
- jscript是啥东西
- 2012年 上半年 第十二周 C++程序设计 (三十四)
- 看完这20部电影,你可以去全球任何一家公司做董事长或总经理
- poj1364(King)
- 枚举子窗口
- 数据结构03.1->Stack栈的模拟(数组)
- 【每日面试题】字符串倒置的递归算法
- OC-NewsReader项目
- 设计模式学习笔记——命令模式
- 预编译头的概念
- XSS中的script标签与img标签
- OC-todolist项目