HDU5772 (最小割)
Problem String problem (HDU5772)
题目大意
给定一个由数字组成的字符串(n<=100),挑选出一些字符组成一个新的字符串。
字符串的价值: sigma w[id(i)][id(j))] (i !=j) id(i)为某字符在原串中的位置,w[][]为给定矩阵。
字符串的代价: 设x为数字i出现的次数,则代价为a[i]*(x-1)+b[i] (x>0) 0 (x=0)
要求最大化价值-代价。
题目分析
比较难想到的最大权闭合图模型。
昨天刚补完一道,今天又没想出来~~
搬运官方题解:

参考程序
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std; #define INF 2000000000
#define V 6000
#define E 100000
int n,m,ans,dis[V],S,T; struct line{
int u,v,c,nt;
}eg[E];
int lt[V],sum=; void adt(int u,int v,int c){
eg[++sum].u=u; eg[sum].v=v; eg[sum].c=c; eg[sum].nt=lt[u]; lt[u]=sum;
} void add(int u,int v,int c){
// printf("%d %d %d\n",u,v,c );
adt(u,v,c); adt(v,u,);
} void init(){
memset(lt,,sizeof(lt));
sum=; ans=;
} bool bfs(){
memset(dis,,sizeof(dis));
dis[S]=;
queue<int> Q;
Q.push(S);
while (!Q.empty()){
int u=Q.front();
Q.pop();
for (int i=lt[u];i;i=eg[i].nt){
int v=eg[i].v;
if (eg[i].c && !dis[v]){
dis[v]=dis[u]+;
Q.push(v);
}
}
}
return dis[T]>;
} int dfs(int u,int flow){
if (u==T) return flow;
int res=,f;
for (int i=lt[u];i;i=eg[i].nt){
int v=eg[i].v;
if (eg[i].c&&dis[v]==dis[u]+){
f=dfs(v,min(flow-res,eg[i].c));
res+=f;
eg[i].c-=f;
eg[i ^ ].c+=f;
if (flow==res) break;
}
}
if (!res) dis[u]=-;
return res;
} int dinic(){
int sum=;
while (bfs()) sum+=dfs(S,INF);
return sum;
} int main(){ int Tp,cas=,cnt;
char s[];
int a[],b[],w[][]; scanf("%d",&Tp);
while (Tp--){
init(); scanf("%d",&n);
scanf("%s",s+);
for (int i=;i<=;i++) scanf("%d%d",&a[i],&b[i]);
for (int i=;i<=n;i++)
for (int j=;j<=n;j++)
{
scanf("%d",&w[i][j]);
ans+=w[i][j];
}
S=,T=n*(n-)/+n++,cnt=;
for (int i=;i<=n;i++)
for (int j=i+;j<=n;j++){
cnt++;
add(S,cnt,w[i][j]+w[j][i]);
add(cnt,n*(n-)/+i,INF);
add(cnt,n*(n-)/+j,INF);
}
for (int i=;i<=n;i++){
add(n*(n-)/+i,n*(n-)/+n+s[i]-''+,INF);
add(n*(n-)/+i,T,a[s[i]-'']);
}
for (int i=;i<=;i++)
add(n*(n-)/+n+i+,T,(b[i]-a[i]));
n=T;
printf("Case #%d: %d\n",++cas,ans-dinic());
}
}
HDU5772 (最小割)的更多相关文章
- BZOJ 1391: [Ceoi2008]order [最小割]
1391: [Ceoi2008]order Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1509 Solved: 460[Submit][Statu ...
- BZOJ-2127-happiness(最小割)
2127: happiness(题解) Time Limit: 51 Sec Memory Limit: 259 MBSubmit: 1806 Solved: 875 Description 高一 ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- BZOJ3438 小M的作物(最小割)
题目 Source http://www.lydsy.com/JudgeOnline/problem.php?id=3438 Description 小M在MC里开辟了两块巨大的耕地A和B(你可以认为 ...
- 最大流-最小割 MAXFLOW-MINCUT ISAP
简单的叙述就不必了. 对于一个图,我们要找最大流,对于基于增广路径的算法,首先必须要建立反向边. 反向边的正确性: 我努力查找了许多资料,都没有找到理论上关于反向边正确性的证明. 但事实上,我们不难理 ...
- bzoj1412最小割
太羞耻了,m n写反了(主要是样例n m相等) 建图方法比较高(ji)端(chu),对于可以加栅栏的地方连上1的边,然后求最小割即可 为了让代码优(suo)美(duan),我写了一个check,避免多 ...
- 【BZOJ1497】[NOI2006]最大获利 最小割
裸的最小割,很经典的模型. 建图:要求总收益-总成本最大,那么将每条弧与源点相连,流量为成本,每个收益与汇点相连,流量为收益,然后每条弧与它所能到达的收益相连,流量为inf. 与源点相连的是未被选中的 ...
- 二分图&网络流&最小割等问题的总结
二分图基础: 最大匹配:匈牙利算法 最小点覆盖=最大匹配 最小边覆盖=总节点数-最大匹配 最大独立集=点数-最大匹配 网络流: 技巧: 1.拆点为边,即一个点有限制,可将其转化为边 BZOJ1066, ...
- CQOI 2016 不同的最小割
题目大意:一个无向图,求所有点对不同的最小割种类数 最小割最多有n-1个,这n-1个最小割构成一个最小割树 分治法寻找n-1个最小割.对于当前点集X,任选两点为ST做最小割,然后找出与S相连的所有点和 ...
随机推荐
- Stylus Studio的安装与卸载
- Java 生成压缩包,ZipOutputStream的使用
案例:根据url 获取网络资源A,B,C 将资源A,B,C放在一起生成一个xxx.zip 直接看代码 import java.io.File; import java.io.FileOutputS ...
- apache2.4域名配置参数
apache2.4和 2.2版本的配置有区别 2.4的配置如下 <VirtualHost *:80>DocumentRoot /www/web/projectServerName www. ...
- C#图书资源【更新中...】喜欢的就转存吧
百度分享暂时取消了,需要的朋友可以直接关注我,我发给你. 重点篇 1.C#与.NET3.5高级程序设计 2.C#与.NET3.5高级程序设计.rar 3.Effective_C#_中文版_改善C#程序 ...
- sql2008 附加数据库出错解决方法
当遇到 无法为此请求检索数据,(Microsoft.SqlServer.SmoEnum)其他信息执行Transact-Sql语句或批处理时发生了异常, Microsoft.SqlServer.Conn ...
- 项目构建工具Gradle的使用入门(参考,只表明地址)
Gradle入门介绍:简介 http://blog.jobbole.com/71999/ Gradle入门介绍:第一个Java项目 http://blog.jobbole.com/72558/ Gra ...
- iOS产品开发流程
iOS产品开发流程 a.产品经理做需求调研,确定产品需求,编写需求文档 b.产品人员完成产品原型 c.产品经理召开会议(产品,UI,UE,开发,测试,服务器) d.设计人员根据原型设计出一系列UI界面 ...
- POJ 2762 tarjan缩点+并查集+度数
Going from u to v or from v to u? Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 15494 ...
- 二模 (9) day2
第一题: 题目大意:求满足条件P的N位二进制数的个数.P:该二进制数有至少3个0或者3个1挨在一起.. N<=20000 解题过程: 1.一开始直接写了个dfs把表打了出来,不过没发现什么规律, ...
- Deep Learning 初识
实际生活中,人们为了解决一个问题,如对象的分类(对象可是是文档.图像等),首先必须做的事情是如何来表达一个对象,即必须抽取一些特征来表示一个对象,如文本的处理中,常常用词**来表示一个文档,或把文档表 ...