HPU 1707:求解不等式【SPFA & 差分约束】
2015-08-21 21:26
357 查看
1707: 求解不等式
时间限制: 1 Sec 内存限制: 128 MB提交: 11 解决: 3
[提交][状态][讨论版]
题目描述
给你X1,X2,X3,X4...Xn一共N个未知量和M个不等式。问你该不等式组有没有解。输入
输入有多组测试数据,第一行有两个数N和M,分别表示未知量个数和不等式数目。接下来M行,每行有四个数a,b,c,d,若d为0表示一个不等式a - b <= c,若d为1表示一个不等式a - b >= c。
输出
若无解输出-1,反之输出每个未知量的值。输出格式如i:ans。具体看输出。我不喜欢过大的数,所以我的标准是——若存在解,那么x1的值就为0.
样例输入
5 8 1 2 0 0 1 5 -1 0 2 5 1 0 3 1 5 0 4 1 4 0 4 3 -1 0 5 3 -3 0 5 4 -3 0
样例输出
1:0 2:2 3:5 4:4 5:1
AC-code:
#include<cstdio> #include<cstring> #include<queue> #define INF 0x3f3f3f using namespace std; int head[1100*1100],num,n; struct node { int to,val,next; }A[1100*1100]; void chan(int x,int y,int z) { node e={y,z,head[x]}; A[num]=e; head[x]=num++; } void spfa(int sx) { int dis[1100],vis[1100],used[1100]; memset(dis,INF,sizeof(dis)); memset(vis,0,sizeof(vis)); memset(used,0,sizeof(used)); dis[sx]=0; vis[sx]=1; used[sx]++; queue<int>q; q.push(sx); while(!q.empty()) { int top=q.front(); q.pop(); vis[top]=0; for(int i=head[top];i!=-1;i=A[i].next) { int v=A[i].to; if(dis[v]>dis[top]+A[i].val) { dis[v]=dis[top]+A[i].val; if(!vis[v]) { vis[v]=1; used[v]++; if(used[v]>n) { printf("-1\n"); return ; } q.push(v); } } } } for(int i=1;i<=n;i++) printf("%d:%d\n",i,dis[i]-dis[1]); } int main() { int m,a,b,c,d,i; while(~scanf("%d%d",&n,&m)) { num=0; memset(head,-1,sizeof(head)); for(i=1;i<=n;i++) chan(0,i,0); while(m--) { scanf("%d%d%d%d",&a,&b,&c,&d); if(d==0) chan(b,a,c); else chan(a,b,-c); } spfa(0); } return 0; }
相关文章推荐
- 一个C++的平衡二叉树例子
- OC中NSMutableArray 和NSMutableDictionary 中打印乱码问题
- scaleType-模拟按钮加文字整天点击效果
- 黑马程序员--Java基础学习(面向对象)第七天
- View和ViewGroup的事件分发机制详解
- hdu5414 CRB and String
- 长链非编码RNA(lncRNA)
- Linux系统管理之十四---服务
- 后端分布式系列:分布式存储-HDFS 架构解析
- 后端分布式系列:分布式存储-HDFS 架构解析
- ShapeDrawable做放大镜效果
- ShapeDrawable做放大镜效果
- shell编程——if条件判断(转)
- java并发编程---如何创建线程以及Thread类的使用
- ShapeDrawable做放大镜效果
- 用 mongodb + elasticsearch 实现中文检索
- 后端分布式系列:分布式存储-HDFS 架构解析
- Android UI设计——EditText控件
- HDFS 架构解析
- 端到段、点到点通信的区别 优缺点