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相连的所有点和 ...
随机推荐
- MongoDB 一对多关系建模
转文: 本篇博客翻译自: http://blog.mongodb.org/post/87200945828/6-rules-of-thumb-for-mongodb-schema-design-par ...
- PHP可变长函数方法介绍
1.三个重要函数 func_num_args() 返回实参个数 func_get_arg(i) 返回某个实参的值 func_get_args() 以数组的形式返回实参 ...
- ThoughtWorks微服务架构交流心得
ThoughtWorks微服务架构交流心得: (1)<人月神话>中谈到软件开发没有银弹,根源在于软件所解决的领域问题本身固有的复杂性,微服务正是从领域问题角度上进行服务拆分,来降低软件 ...
- 数据库与SQL语言
数据库(DB) :长期储存在计算机中.有组织.可共享的数据的集合. 特点:(1)数据按一定的数据模型组织.描述和储存:(2)较小的冗余度:(3)数据独立性较高:(4)易扩展:(5)可共享(不同用户可按 ...
- linux :TOP命令及参数解析
第二行 分别显示:total进程总数. running正在运行的进程数. sleeping睡眠的进程数.stopped停止的进程数. zombie僵尸进程数. 第三行 分别显示: %us 用户空间占用 ...
- 第三章 XHTML 表单
1.表单的主要作用在于在网页上提供一个图形用户界面,以采集和提交用户输入的数据. 2.HTML表单元素和属性可以分为两种类型:定义表单整体结构,使浏览器知道如何处理表单数据的元素:创建输入控件的元素. ...
- java正则表达式之java小爬虫
这个java小爬虫, 功能很简单,只有一个,抓取网上的邮箱.用到了javaI/O,正则表达式. public static void main(String[] args) throws IOExce ...
- strstr strchr strrchr
通过函数的定义来区分: 1.strstr: 返回子串出现的第一次位置 char *strstr(const char *haystack, const char *needle) 可见,strstr函 ...
- C-crash的方法
#include <iostream> using namespace std; int main() { #if 0 //devide by 0 ; ; double d = i/j; ...
- poj 2536 GopherII(二分图匹配)
Description The gopher family, having averted the canine threat, must face a new predator. The are n ...