[Luogu 3410]拍照
2018-02-01 11:11
239 查看
题目类型:最大权值闭合子图
题目分析:
注意可以不带人。实现代码:
#include <cstdio> #include <iostream> #include <queue> #include <cstring> #define il inline using namespace std; const int inf=0x7fffffff; const int maxm=210000; int head[maxm],to[maxm*2],cap[maxm*2],net[maxm*2],deep[maxm],cnt=1; il void add(int x,int y,int c){cnt++,to[cnt]=y,cap[cnt]=c,net[cnt]=head[x],head[x]=cnt;} queue <int> dl; int vis[maxm]; il bool BFS(int s,int t) { while(!dl.empty()) dl.pop(); memset(deep,-1,sizeof(deep)); dl.push(s),deep[s]=0; while(!dl.empty()) { int x=dl.front();dl.pop(); for(int i=head[x];i;i=net[i]) if(cap[i]>0&&deep[to[i]]==-1) dl.push(to[i]),deep[to[i]]=deep[x]+1; } return deep[t]==-1?0:1; } int dfs(int now,int flow,int t) { if(now==t) return flow; int w,used=0; for(int i=head[now];i;i=net[i]) { int v=to[i]; if(deep[v]==deep[now]+1&&cap[i]) { w=dfs(v,min(flow-used,cap[i]),t); cap[i]-=w; cap[i^1]+=w; used+=w; if(used==flow) return flow; } } if(!used) deep[now]=-1; return used; } il int dinic(int s,int t) { int maxflow=0; while(BFS(s,t)) maxflow+=dfs(s,inf,t); return maxflow; } inline void adx(int x,int y,int cax) { add(x,y,cax),add(y,x,0); } int main() { int n,m; scanf("%d%d",&m,&n); int s=n+m+99,t=n+m+100,sum=0; for(int i=1;i<=m;i++) { int c; scanf("%d",&c); adx(s,i+n,c),sum+=c; int w; while(1) { scanf("%d",&w); if(!w) break; adx(i+n,w,inf); } } for(int i=1,c;i<=n;i++) scanf("%d",&c),adx(i,t,c); return printf("%d\n",max(sum-dinic(s,t),0))*0; }
相关文章推荐
- 【luogu 3410】拍照
- 【LuoguP3410】拍照
- Android 聚焦拍照和震动
- [Luogu1119]采蘑菇
- 调用android系统相机拍照并保存
- Luogu 3378(堆)
- android系统如何在静音模式下关闭camera拍照声音(2)
- Luogu 3375(KMP)
- Lumia 1020 诞生:诺基亚拍照技术的一次狂欢
- Luogu 3807(Lucas定理)
- android 调用照相机拍照与图片选择图片选择
- Luogu-1886 (单调队列)
- 使用HTML5拍照
- 如何兼容所有Android版本选择照片或拍照然后裁剪图片--基于FileProvider和动态权限的实现
- android使用webview上传文件(支持相册和拍照)
- [NOIP2017][luogu3959]宝藏treasure
- Android 从相册和拍照选择图片
- [LUOGU]1141 01迷宫
- 利用Android手机里的摄像头进行拍照
- Luogu-3391 (splay模板)