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 (最小割)的更多相关文章

  1. BZOJ 1391: [Ceoi2008]order [最小割]

    1391: [Ceoi2008]order Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1509  Solved: 460[Submit][Statu ...

  2. BZOJ-2127-happiness(最小割)

    2127: happiness(题解) Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 1806  Solved: 875 Description 高一 ...

  3. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  4. BZOJ3438 小M的作物(最小割)

    题目 Source http://www.lydsy.com/JudgeOnline/problem.php?id=3438 Description 小M在MC里开辟了两块巨大的耕地A和B(你可以认为 ...

  5. 最大流-最小割 MAXFLOW-MINCUT ISAP

    简单的叙述就不必了. 对于一个图,我们要找最大流,对于基于增广路径的算法,首先必须要建立反向边. 反向边的正确性: 我努力查找了许多资料,都没有找到理论上关于反向边正确性的证明. 但事实上,我们不难理 ...

  6. bzoj1412最小割

    太羞耻了,m n写反了(主要是样例n m相等) 建图方法比较高(ji)端(chu),对于可以加栅栏的地方连上1的边,然后求最小割即可 为了让代码优(suo)美(duan),我写了一个check,避免多 ...

  7. 【BZOJ1497】[NOI2006]最大获利 最小割

    裸的最小割,很经典的模型. 建图:要求总收益-总成本最大,那么将每条弧与源点相连,流量为成本,每个收益与汇点相连,流量为收益,然后每条弧与它所能到达的收益相连,流量为inf. 与源点相连的是未被选中的 ...

  8. 二分图&网络流&最小割等问题的总结

    二分图基础: 最大匹配:匈牙利算法 最小点覆盖=最大匹配 最小边覆盖=总节点数-最大匹配 最大独立集=点数-最大匹配 网络流: 技巧: 1.拆点为边,即一个点有限制,可将其转化为边 BZOJ1066, ...

  9. CQOI 2016 不同的最小割

    题目大意:一个无向图,求所有点对不同的最小割种类数 最小割最多有n-1个,这n-1个最小割构成一个最小割树 分治法寻找n-1个最小割.对于当前点集X,任选两点为ST做最小割,然后找出与S相连的所有点和 ...

随机推荐

  1. 你需要知道的三个 CSS3技巧(转)

    1. 在CSS中用attr()显示HTML属性值 attr()功能早在CSS 2.1标准中就已经出现,但现在才开始普遍流行.它提供了一个巧妙的方法在CSS中使用HTML标签上的属性,在很多情况下都能帮 ...

  2. 从java 转到 c# 知识点

    1. 重写的父类方法 必须是虚方法 用virtual 关键字修饰 而子类必须用 ovrride 关键字 java中不需要,, 2. namespace => packet using => ...

  3. Neo4j图数据库简介和底层原理

    现实中很多数据都是用图来表达的,比如社交网络中人与人的关系.地图数据.或是基因信息等等.RDBMS并不适合表达这类数据,而且由于海量数据的存在,让其显得捉襟见肘.NoSQL数据库的兴起,很好地解决了海 ...

  4. VS构建工具介绍

    VS构建工具介绍 我们都知道C/C++源代码要生成可执行的.exe程序,需要经过编译.链接的过程.你在VS工具中只需要选择菜单Build或按一下F5可以编译.链接.运行了,其实IDE帮我隐藏了好多的具 ...

  5. EF Code First 学习笔记:关系

      一对多关系 项目中最常用到的就是一对多关系了.Code First对一对多关系也有着很好的支持.很多情况下我们都不需要特意的去配置,Code First就能通过一些引用属性.导航属性等检测到模型之 ...

  6. MySql中添加用户/删除用户

    MySql中添加用户,新建数据库,用户授权,删除用户,修改密码(注意每行后边都跟个;表示一个命令语句结束): 1.新建用户 登录MYSQL: @>mysql -u root -p @>密码 ...

  7. 转载:完全卸载oracle11g步骤

    完全卸载oracle11g步骤: 1. 开始->设置->控制面板->管理工具->服务 停止所有Oracle服务. 2. 开始->程序->Oracle - OraHo ...

  8. 终于!Linaro 加盟 Zephyr 项目

    导读 为物联网构建实时操作系统的开源协作项目 Zephyr 项目宣布,Linaro 有限责任公司以白金会员的身份加盟该项目.Linaro是一家为 ARM 架构开发开源软件的协作工程组织,也是全球性机构 ...

  9. 2.精通前端系列技术之seajs和gruntJs结合开发(三)

    1.我们先来了解下模块化历史 模块化历史 nodeJS的出现(http://nodejs.org/) commonJS规范(http://www.commonjs.org/) 浏览器JS的模块化? A ...

  10. WEKA使用教程(界面工具的用法)

    WEKA使用教程 目录 1. 简介2. 数据格式3.数据准备4. 关联规则(购物篮分析)5. 分类与回归6. 聚类分析 1. 简介 WEKA的全名是怀卡托智能分析环境(Waikato Environm ...