BZOJ1061[Noi2008] 志愿者招募
2016-02-29 10:41
232 查看
AC通道:http://www.lydsy.com/JudgeOnline/problem.php?id=1061
然后codevs上也有,可以先去codevs上交一发[你看我这广告打的好吧= =]
BYvoid的题解写的比较清楚,也有图有样例,很良心:
https://www.byvoid.com/blog/noi-2008-employee/#more-916
先看完上面的博客吧...
然后BYvoid看上去是推的式子也很好列,因为你观察X(i)的正负,因为每次都是相邻的相减嘛,又因为每个人都是连续一段的,所以正号出现在第l[i]个式子中,负号出现在第r[i]+1个式子中。
然后y[i]就更简单了,正的出现在i+1,负的出现在i,然后初始建图部分就很好打了。
然后这题SPFA跑得有点慢= =。尽管加了一个SLF优化[不太记得名字了],还一个是LLL优化,据说两个在一起才是最好?
View Code
这题告诉我们线性规划和网络流之间是有联系的...
然后codevs上也有,可以先去codevs上交一发[你看我这广告打的好吧= =]
BYvoid的题解写的比较清楚,也有图有样例,很良心:
https://www.byvoid.com/blog/noi-2008-employee/#more-916
先看完上面的博客吧...
然后BYvoid看上去是推的式子也很好列,因为你观察X(i)的正负,因为每次都是相邻的相减嘛,又因为每个人都是连续一段的,所以正号出现在第l[i]个式子中,负号出现在第r[i]+1个式子中。
然后y[i]就更简单了,正的出现在i+1,负的出现在i,然后初始建图部分就很好打了。
然后这题SPFA跑得有点慢= =。尽管加了一个SLF优化[不太记得名字了],还一个是LLL优化,据说两个在一起才是最好?
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=1010; const int maxm=10010; const int INF=0x3f3f3f3f; struct Node{ int data,next,low,cost; }node[(maxm<<1)+(maxn<<2)]; #define www node[point].low #define now node[point].data #define ccc node[point].cost #define then node[point].next int n,m,ans,cnt; int s,t; int a[maxn],head[maxn],cur[maxn]; int dis[maxn],pre[maxn]; bool vis[maxn]; void add(int u,int v,int w,int c){ node[cnt].data=v;node[cnt].next=head[u];node[cnt].low=w;node[cnt].cost=c;head[u]=cnt++; node[cnt].data=u;node[cnt].next=head[v];node[cnt].low=0;node[cnt].cost=-c;head[v]=cnt++; } int dfs(int x,int low){ if(x==t) return low; int Low;vis[x]=true; for(int &point=cur[x];point!=-1;point=then) if(www && !vis[now] && dis[now]+ccc==dis[x]){ Low=dfs(now,min(low,www)); if(Low){ www-=Low,node[point^1].low+=Low; return Low; } } return 0; } bool modify(){ int ad=INF; for(int i=s;i<=t;i++) if(vis[i]) for(int point=head[i];point!=-1;point=then) if(www && !vis[now]) ad=min(ad,dis[now]-dis[i]+ccc); if(ad==INF) return false; for(int i=s;i<=t;i++) if(vis[i]) vis[i]=false,dis[i]+=ad; return true; } int main(){ #ifndef ONLINE_JUDGE freopen("1061.in","r",stdin); freopen("1061.out","w",stdout); #endif int u,v,c; scanf("%d%d",&n,&m); t=n+2; for(int i=s;i<=t;i++) head[i]=-1; for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=n+1;i++){ if(a[i]-a[i-1]>0) add(s,i,a[i]-a[i-1],0); else add(i,t,a[i-1]-a[i],0); } for(int i=1;i<=m;i++){ scanf("%d%d%d",&u,&v,&c); add(u,v+1,INF,c); } for(int i=1;i<=n;i++) add(i+1,i,INF,0); int flag; do{ for(int i=s;i<=t;i++) cur[i]=head[i]; while(flag=dfs(s,INF)) ans+=dis[s]*flag; }while(modify()); printf("%d",ans); return 0; }
View Code
这题告诉我们线性规划和网络流之间是有联系的...
相关文章推荐
- Android优化——UI优化(五) Listview 重用convertView
- iOS开发文件夹--Copy items if needed
- android 调用系统相机拍照 获取原图
- 流行的Go语言web框架简介
- 【Linux】linux常用基本命令
- 如何降低人员流失造成对项目进度的影响
- DataTbale分页显示
- JAVA泛型的基本使用
- Android Material Design之CoordinatorLayout+AppBarLayout实现上滑隐藏ToolBar
- R.swift:以一种优雅安全的方式使用资源文件
- JPA基础思路
- 让IE6 IE7 IE8 IE9 IE10 IE11支持Bootstrap的解决方法
- 第五十一篇:LBP 解释
- 状态压缩动态规划入门
- SAS Timeseries Modelling
- tomcat架构分析(valve机制)
- 基于angularJS和requireJS的前端架构
- 简易csv解析
- 简易csv解析
- linux vi保存退出命令 (如何退出vi)