zoj Burn the Linked Camp(差分约束)
2015-11-04 19:12
423 查看
题目传送门
这题要先知道差分约束的基本概念,详见博客内容在这里~
题目就是给出了士兵的营帐分别能住人的最大值,和在哪些营帐区间之内,能拥有的士兵最大量,容易看出这是差分约束的典型模型,建图的时候要注意差分约束的建图方法,如果要求最大值想办法把每个不等式变为标准x-y<=k的形式,然后建立一条从y到x权值为k的边,这里表现为i点和i-1建立的负边。
ac代码如下
![](http://img.blog.csdn.net/20151104190939245)
这题要先知道差分约束的基本概念,详见博客内容在这里~
题目就是给出了士兵的营帐分别能住人的最大值,和在哪些营帐区间之内,能拥有的士兵最大量,容易看出这是差分约束的典型模型,建图的时候要注意差分约束的建图方法,如果要求最大值想办法把每个不等式变为标准x-y<=k的形式,然后建立一条从y到x权值为k的边,这里表现为i点和i-1建立的负边。
ac代码如下
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> using namespace std; struct edge{ int u,v,w; }Edge[30010]; int dis[1005]; int n,m,cnt; bool Bell_Ford() { memset(dis,0,sizeof(dis)); for(int i=0;i<n;i++) { bool notfish=true; for(int j=0;j<cnt;j++) { if(dis[Edge[j].u]+Edge[j].w>dis[Edge[j].v]) { notfish=false; dis[Edge[j].v]=dis[Edge[j].u]+Edge[j].w; } } if(notfish) return true; } for(int i=0;i<cnt;i++)//pan duan shi fou you update. { if(dis[Edge[i].u]+Edge[i].w>dis[Edge[i].v]) { return false; } } return true; } void add_edge(int u,int v,int w) { Edge[cnt++]=(edge){u,v,w}; } int main() { int x,y,z; while(~scanf("%d%d",&n,&m)) { cnt=0; for(int i=1;i<=n;i++) { scanf("%d",&x); add_edge(i,i-1,-x); } for(int i=1;i<=m;i++) { scanf("%d%d%d",&x,&y,&z); add_edge(x-1,y,z); } for(int i=1;i<=n;i++) { add_edge(0,i-1,0); } //0作为虚拟原点 bool flag=Bell_Ford(); if(!flag) { puts("Bad Estimations"); } else { printf("%d\n",dis ); } } return 0; }
相关文章推荐
- 我的iOS学习历程 - OC第八天
- hdu 5532 Almost Sorted Array(最长不上升子序列、暴力)
- 高效开发 Android App 的 10 个建议
- 我的iOS学习历程 - OC第八天
- 【转】人,技术与流程
- Java局域网聊天系统(服务器客户端一对一)
- C6414上移植LwIP
- Monkey测试简介
- 安卓广播使用 BroadcastReceiver
- 线程的sleep,join,yield方法
- Android Tablelayout表格显示问题
- 搜索引擎的架构_读书笔记
- top命令的Load average 含义及性能参考基值
- c++ 时间格式化
- Hardwood Species(水)
- asp.net mvc + javascript导入文件内容
- 实时操作系统若干问题
- 超级系统工具Sysdig,比 strace、tcpdump、lsof 加起来还强大
- 随笔
- div自动适应高度