BZOJ3876: [Ahoi2014]支线剧情
2016-06-18 14:55
253 查看
有下界最小费用可行流。建图可以优化,我没优化。
#include<algorithm> #include<cstdio> #include<cstring> using std::min; const int inf=1061109567; const int N=305; const int s=N-1; const int t=N-2; int n,z ,q[N*N],c ,d ; struct edge{ int v,w,f;edge*s; }e[N*N]; edge*a=e,*h ; void ins(int u,int v,int w,int f){ edge s={v,w,f,h[u]}; edge t={u,-w,0,h[v]}; *(h[u]=a++)=s; *(h[v]=a++)=t; } bool spfa(){ memset(c,63,sizeof c); memset(d,0,sizeof d); c[q[0]=t]=0; for(int a=0,b=0;a<=b;++a){ int u=q[a]; z[u]=0; for(edge*i=h[u];i;i=i->s) if(e[i-e^1].f&&c[u]-i->w<c[i->v]){ c[i->v]=c[u]-i->w; d[i->v]=d[u]+1; if(!z[i->v]++) q[++b]=i->v; } } return c[s]!=inf; } int dfs(int u,int v){ if(u==t)return v; int s=v; for(edge*i=h[u];i;i=i->s) if(c[i->v]==c[u]-i->w&&d[i->v]==d[u]-1&&i->f){ int j=dfs(i->v,min(i->f,s)); i->f-=j,s-=j; e[i-e^1].f+=j; if(!s)break; } if(s==v)c[u]=inf; return v-s; } int main(){ scanf("%d",&n); for(int i=1;i<=n;++i){ int j,v,w; scanf("%d",&j); ins(i,t,0,j); ins(i,1,0,inf); while(j--){ scanf("%d%d",&v,&w); ins(s,v,w,1); ins(i,v,w,inf); } } int k=0; while(spfa()) while(int j=dfs(s,inf)) k+=j*c[s]; printf("%d\n",k); }
相关文章推荐
- Java学习:static 静态变量
- [leetcode] 361. Bomb Enemy 解题报告
- 把字符串转换成整数
- STL之vector
- Android 利用内容提供者添加联系人的操作
- STL之vector
- 如何编写驱动程序
- sublime 3 注册码+PYTHON 环境配置+pylint插件path问题+package control找不到packages解决方法。
- Android之粗仿微信6.0——微信6.0的欢迎界面
- 头文件互相包含与error C2146: 语法错误 : 缺少“;”的问题
- android-- 一个FlowLayout带你学会自定义ViewGroup
- html中文乱码
- leetcode题解日练--2016.6.17
- jQuery操作元素的属性与样式
- MYSQL 免安装版配置
- 【深入Java虚拟机】之一:Java内存区域与内存溢出
- 《30天》的汇编实现(二)
- linux系统编程之文件与I/O(一):文件的打开关闭
- 最新Android实现分享到QQ QZone 博客功能(集成官方SDK,不使用第三方)
- Windows Driver Kit(Windows Driver Kit官方下载)V7.6.0官方版