hdu 6126 Give out candies(最小割)

题意:

有\(n\)个小朋友,标号为\(1\)到\(n\),你要给每个小朋友至少\(1\)个且至多\(m\)个的糖果。小朋友们共提出\(k\)个要求,每个要求包括三个整数\(x,y,z\),表示\(x\)号小朋友得到的糖果数减去\(y\)号小朋友得到的糖果数,结果应当不大于\(z\)。如果你给\(i\)号小朋友\(j\)颗糖果,他会获得\(w_{i,j}\)

的满意度,你需要最大化所有小朋友的满意度之和。\(1\leq n,m\leq50,1\leq k\leq150,1\leq w_{i,j}\leq10^3\)

​​ 。

题解:

用\(i.j\)这点表示给第\(i\)个孩子至少\(j\)块糖,当这个点属于S集合时所代表条件成立。然后\(i.j->i.j+1\)连\(1000-w_{i,j},i.m\)向\(T\)连\(1000-w_{i,m},S\)向\(i.1\)连\(inf\)。如果存在\(a_x-a_y>=z\),\(x.k->y.k+z\)连\(inf\)。跑最小割,再用\(n*1000\)减掉答案。

网络流的题目建模总是很玄的,结合这篇博客理解了一下,虽然还是没有完全领悟。

首先考虑没有限制的情况,那么显然选\(w_{i,j}\)越大越好,按题解建图的方法,令这条边的容量为\(F-w_{i,j}\),F为一个足够大的数,显然最小割会选到这条边。

想象一下 对限制连流量无穷大的边的情况

首先在合法情况下,给一条边的容量设置为无穷大,表示这条边是无法被最小割选到的

如果没有限制,每个人选择方案可以在同侧,连了限制的边后,就限制了选择方案必须在这条边的两侧,这样才能保证能够割到这条无穷大的边,如果跑出来的流量是无穷大的,说明最小割不存在,没有合法选择。

#include<bits/stdc++.h>

using namespace std;
const int maxn = 3000;
const int inf = 0x3f3f3f3f;
struct Edge{
int u,v,cap,flow;
Edge(){};
Edge(int u,int v,int cap,int flow):u(u),v(v),cap(cap),flow(flow){}
};
struct Dinic{
int n,m,s,t;
vector<Edge> edges;
vector<int> G[maxn];
int vis[maxn],d[maxn],cur[maxn];
void init(int n){
this->n = n;
for(int i = 0;i < n;i++) G[i].clear();
edges.clear();
}
void add(int u,int v,int cap){
edges.push_back(Edge(u,v,cap,0));
edges.push_back(Edge(v,u,0,0));
m = edges.size();
G[u].push_back(m-2);
G[v].push_back(m-1);
}
bool bfs(){
memset(vis,0,sizeof(vis));
queue<int> q;
q.push(s);vis[s] = 1,d[s] = 0;
while(!q.empty()){
int u = q.front();q.pop();
for(auto x:G[u]){
auto e = edges[x];
if(!vis[e.v] && e.cap > e.flow){
vis[e.v] = 1;
d[e.v] = d[u] + 1;
q.push(e.v);
}
}
}
return vis[t];
}
int dfs(int u,int a){
if(u == t || a == 0) return a;
int flow = 0,f,sz = G[u].size();
for(int &i = cur[u];i < sz;i++){
auto &e = edges[G[u][i]];
if(d[u] + 1 == d[e.v] && ((f = dfs(e.v,min(a, e.cap-e.flow)))>0)){
e.flow += f,edges[G[u][i]^1].flow -= f;
flow += f,a -= f;
if(a == 0) break;
}
}
return flow;
}
int Maxflow(int s,int t){
this->s = s,this->t = t;
int flow = 0;
while(bfs()){
memset(cur,0,sizeof(cur));
flow += dfs(s,inf);
}
return flow;
}
}dic;
int main(){
int T;
scanf("%d",&T);
while(T--){
int n,m,k,x,y,z;
scanf("%d%d%d",&n,&m,&k);
int s = n * m,t = s + 1;
dic.init(n * m + 2);
for(int i = 0;i < n;i++){
dic.add(s,i * m,inf);
for(int j = 0;j < m - 1;j++){
scanf("%d",&x);
dic.add(i * m + j,i * m + j + 1,1000 - x);
}
scanf("%d",&x);
dic.add(i * m + m - 1,t,1000 - x);
}
while(k--){
scanf("%d%d%d",&x,&y,&z);x--,y--;
for(int j = 1;j <= m;j++){
if(j - z > 0){
if(j - z > m) dic.add(x * m + j - 1, t, inf);
else dic.add(x * m + j - 1, y * m + j - z - 1,inf);
}
}
}
int cost = dic.Maxflow(s,t);
if(cost >= inf) cost = -1;
else cost = n * 1000 - cost;
printf("%d\n",cost);
}
return 0;
}

hdu 6126 Give out candies的更多相关文章

  1. HDU 6126.Give out candies 最小割

    Give out candies Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Other ...

  2. HDU 6126 Give out candies(网络流)

    题目给出n,m,k 然后给出n*m的矩阵a[i][j]代表第i个人在获得j 颗糖果能得到的满足值, 然后k是k行每行输入三个整数x,y,z     ,x,y,z表示一组限制表示第x个人分到的糖数减去第 ...

  3. Hdu 5407 CRB and Candies (找规律)

    题目链接: Hdu 5407 CRB and Candies 题目描述: 给出一个数n,求lcm(C(n,0),C[n,1],C[n-2]......C[n][n-2],C[n][n-1],C[n][ ...

  4. HDU 6085 - Rikka with Candies | 2017 Multi-University Training Contest 5

    看了标程的压位,才知道压位也能很容易写- - /* HDU 6085 - Rikka with Candies [ 压位 ] | 2017 Multi-University Training Cont ...

  5. 【HDU 6126】Give out candies 最小割

    题意 有$n​$个小朋友,给每个人分$1~m​$个糖果,有k个限制 限制形如$(x,y,z)​$ 表示第$x​$个人分到的糖数减去第$y​$个人分到的糖数不大于$z​$,给第$i​$个人$j​$颗糖获 ...

  6. 2017ACM暑期多校联合训练 - Team 5 1001 HDU 6085 Rikka with Candies (模拟)

    题目链接 Problem Description As we know, Rikka is poor at math. Yuta is worrying about this situation, s ...

  7. HDU 6085 Rikka with Candies(bitset)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=6085 [题目大意] 给出一个数组a一个数组b,以及询问数组c, 问对于每个c有多少对a%b=c,答 ...

  8. 2017多校第5场 HDU 6085 Rikka with Candies bitset

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6085 题意:存在两个长度为n,m的数组A,B.有q个询问,每个询问有一个数字k,可以得到Ai%Bj=k ...

  9. HDU 5407——CRB and Candies——————【逆元+是素数次方的数+公式】

    CRB and Candies Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...

随机推荐

  1. laravel-多条件查询并指定key输出

    $room = DB::table('room') ->where(function($query) use($contList){ foreach ($contList as $k=>$ ...

  2. 【nginx】root alias 区别,以及server root , location root 区别

    nginx-root-alias-详解 最近在研究前后端分离站点配置在同一域名下,发现root,alias有区别,而且所有的root如果都放置在location下面访问无效的问题,才有此总结,本文只是 ...

  3. TP3.2.3 页面跳转后 Cookie 失效 —— 参考解决方案

    一.问题描述 接手一个项目,使用ThinkPhp3.2.3,在线上环境( Centos7.4 + Nginx1.14 + MySQL5.7 + PHP7.2.4 )运行没有问题, 在本地环境( php ...

  4. elasticsearch 5.x 系列之七 基于索引别名的零停机升级服务

    一,写在前面的话,elasticsearch 建立索引时的Mapping 设置 建议你在设计索引的初期,就把索引的各个字段设计好,因为,elasticsearch 的各个字段,定义好类型后,就无法进行 ...

  5. Windows手工创建服务方法

    需要将程序设置成Windows服务的情况,可以利用一下windows自带的sc命令来创建服务. 该命令的基本用法如下:打开cmd命令, 输入如下信息:1 创建服务:sc create SecServe ...

  6. Git使用简单总结--源自廖雪峰网站

    创建版本库git add加入到暂存区git commit -m" "加入到分支 时光机穿梭git satus查看仓库的当前状态git diff file 查看修改内容 版本回退HE ...

  7. spark streaming的应用

    今天我们讲spark streaming的应用,这个是实时处理的,类似于Storm以及Flink相关的知识点, 说来也巧,今天的自己也去听了关于Flink的相关的讲座,可惜自己没有听得特别清楚,好像是 ...

  8. Servlet过滤器---编码转换过滤器

    该实例用于将请求与相应的编码设置为当前网站的默认编码 java类: import java.io.IOException; import javax.servlet.Filter; import ja ...

  9. Reverse Word in a String(翻转字符串)&字符串最后一个单词的长度

    1.题目: Given an input string, reverse the string word by word. For example,Given s = "the sky is ...

  10. Java 泛型 二

    一. 泛型概念的提出(为什么需要泛型)? 首先,我们看下下面这段简短的代码: 1 public class GenericTest { 2 3 public static void main(Stri ...