[POJ3169]Layout(差分约束)
2016-03-17 20:56
495 查看
题目描述
传送门题解
求最大值则转化为最短路问题。dis[i]可以表示第i头牛的坐标,那么根据题目描述满足一系列最大最小关系;
隐含条件是dis[i+1]>=dis[i];
由于图连通,不用添加超级源;
用spfa求解即可,如有负环则无解。
代码
#include<iostream> #include<cstring> #include<cstdio> #include<queue> using namespace std; const int max_N=5e4+5; const int max_m=max_N*2; const int max_e=max_m*2; const int INF=1e9; int n,N,M,l,r,w,u,t,ans; int tot,point[max_N],next[max_e],v[max_e],c[max_e]; int dis[max_N]; bool vis[max_N]; queue <int> q; inline void addedge(int x,int y,int z){ ++tot; next[tot]=point[x]; point[x]=tot; v[tot]=y; c[tot]=z; } inline void spfa(){ memset(dis,128,sizeof(dis)); memset(vis,0,sizeof(vis)); dis[0]=0; vis[0]=true; while (!q.empty()) q.pop(); q.push(0); while (!q.empty()){ int now=q.front(); q.pop(); vis[now]=false; for (int i=point[now];i;i=next[i]) if (dis[v[i]]<dis[now]+c[i]){ dis[v[i]]=dis[now]+c[i]; if (!vis[v[i]]){ vis[v[i]]=true; q.push(v[i]); } } } } int main(){ scanf("%d",&n); N=0; for (int i=1;i<=n;++i){ scanf("%d%d%d",&l,&r,&w); u=l; t=r+1; N=max(N,t); addedge(u,t,w); } for (int i=0;i<N;++i){ addedge(i+1,i,-1); addedge(i,i+1,0); } spfa(); ans=dis ; printf("%d\n",ans); }
总结
①最近线性规划老是漏点什么,以后读题要注意了。相关文章推荐
- sort()函数与升序、降序 C++
- 为什么会存在TIME_WAIT <socket-详细分析No buffer space available>
- C++复习笔记
- 继承(子类与父类构造函数的关系)
- BC - King's Order - 数位DP
- 用三方做的豆瓣电影页面
- how to change the original ruby version in Rails app
- VSTO学习(五)——创建Word解决方案
- leetcode---Power of Three
- android 基于ContentProvider 数据库SQLite类库
- 移动互联网思维(持续更新)
- 【HDU2896】病毒侵袭——AC自动机基础
- java第一个程序
- 主键与外键
- 利用jquery模拟select效果
- codevs 1068 乌龟棋
- Android案例练习(一)——智能机器人
- VSTO学习(四)——自定义Excel UI 转载
- 轻松学习 red5 教程 像视频一样很详细还有代码直接可Copy
- PAT 乙级真题 1004.成绩排名