HDU 6126 Give out candies(最小割-Dinic)
来源:互联网 发布:oracle12c新建数据库 编辑:程序博客网 时间:2024/06/16 13:03
Description
有
Input
第一行一整数
Output
如果存在满足所有限制条件的方案,则输出满意度最大值,否则输出-1
Sample Input
2
2 1 1
1
1
1 2 1
3 3 2
1 2 3
2 3 1
3 1 2
1 2 0
2 3 0
Sample Output
2
7
Solution
把一个人
Code
#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>#include<cmath>#include<vector>#include<queue>#include<map>#include<set>#include<ctime>using namespace std;typedef long long ll;#define maxn 2505 #define maxm 20005#define INF 0x3f3f3f3fint head[maxn],cur[maxn],d[maxn],st[maxm],s,e,no;//s为源点,e为汇点,n为点数,no为边数 struct point{ int u,v,flow,next; point(){}; point(int x,int y,int z,int w):u(x),v(y),next(z),flow(w){};}p[maxm];void add(int x,int y,int z)//从x到y建容量为z的边 { p[no]=point(x,y,head[x],z);//前向弧,标号为偶 head[x]=no++; p[no]=point(y,x,head[y],0);//后向弧,标号为奇 head[y]=no++;}void init()//初始化 { memset(head,-1,sizeof(head)); no=0;}bool bfs(){ int i,x,y; queue<int>q; memset(d,-1,sizeof(d)); d[s]=0; q.push(s); while(!q.empty()) { x=q.front(); q.pop(); for(i=head[x];i!=-1;i=p[i].next) { if(p[i].flow&& d[y=p[i].v]<0) { d[y]=d[x]+1; if(y==e) return true; q.push(y); } } } return false;}int dinic()//最大流 { int i,loc,top,x=s,nowflow,maxflow=0; while(bfs()) { memcpy(cur,head,sizeof(head)); top=0; while(true) { if(x==e) { nowflow=INF; for(i=0;i<top;i++) { if(nowflow>p[st[i]].flow) { nowflow=p[st[i]].flow; loc=i; } } for(i=0;i<top;i++) { p[st[i]].flow-=nowflow; p[st[i]^1].flow+=nowflow; } maxflow+=nowflow; top=loc; x=p[st[top]].u; } for(i=cur[x];i!=-1;i=p[i].next) if(p[i].flow&&d[p[i].v]==d[x]+1) break; cur[x]=i; if(i!=-1) { st[top++]=i; x=p[i].v; } else { if(!top) break; d[x]=-1; x=p[st[--top]].u; } } } return maxflow;}int T,n,m,k,w[55][55];int id(int i,int j){ return (i-1)*m+j;}int main(){ scanf("%d",&T); while(T--) { scanf("%d%d%d",&n,&m,&k); init(); s=0,e=n*m+1; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d",&w[i][j]); for(int i=1;i<=n;i++) { add(s,id(i,1),INF); for(int j=1;j<m;j++) add(id(i,j),id(i,j+1),1000-w[i][j]); add(id(i,m),e,1000-w[i][m]); } while(k--) { int x,y,z; scanf("%d%d%d",&x,&y,&z); for(int i=1;i<=m;i++) if(i-z>=1&&i-z<=m) add(id(x,i),id(y,i-z),INF); if(m+1+z>=1&&m+1+z<=m)add(id(x,m+1+z),e,INF); } int ans=dinic(); if(ans>=INF)printf("-1\n"); else printf("%d\n",1000*n-ans); } return 0;}
阅读全文
0 0
- HDU 6126 Give out candies(最小割-Dinic)
- HDU 6126 Give out candies 最小割
- HDU-6126 Give out candies(最小割)
- HDU 6126 Give out candies(最小割)
- HDU 6126 Give out candies (贼巧妙的最小割)
- hdu6126 Give out candies(SPFA+Dinic)
- [HDU 6126] Give out candies
- HDU 1565 方格取数(1)(最小割-Dinic)
- HDU 6142 Jedi Council(最小割-Dinic)
- hdu 4859 海岸线【最小割---------Dinic】
- 【dinic && 拆点 && 最小割】HDU
- POJ 3308 Paratroopers(最小割+Dinic)
- GYM101128F.Landscaping(最小割-Dinic)
- Dinic模板(最大流最小割)
- dinic最大流模板(最小割)
- HDU 3046 Pleasant sheep and big big wolf(最小割-Dinic)
- hdu 5294 Tricks Device (最小割+最短路径+Dinic模板)
- hdu 2435(最小割 --dinic模板-- 最大流)
- VsCode插件整理
- 关于echarts中的关系图,力导向图的编写
- 使用makecontext实现用户线程
- 一些思考
- Android Studio报错之Error:(1, 0) Minimum supported Gradle version is 3.3. Current version is 2.10. Ple
- HDU 6126 Give out candies(最小割-Dinic)
- 谁能比我拼?五一未到,这家厂商已提前打响促销头炮
- SVN分支的合并和同步
- 开发一款扑克游戏,请给出一套洗牌算法,公平的洗牌并将洗好的牌存储在一个整形数组里
- 我的计蒜客刷题之旅(二)
- 新经济浪潮中,做时代的领航者
- Spring cloud + Swarm mode 实战一:portus/harbor部署镜像私有仓库
- ServiceStack.Text / Newtonsoft.Json 两种json序列化性能比较
- 面对猖獗的黑客攻击,你的物联网足够聪明吗?