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)

  要求最大化价值-代价。

题目分析

  比较难想到的最大权闭合图模型。

  昨天刚补完一道,今天又没想出来~~ 

  搬运官方题解:

参考程序

  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <cstring>
  4. #include <queue>
  5. using namespace std;
  6.  
  7. #define INF 2000000000
  8. #define V 6000
  9. #define E 100000
  10. int n,m,ans,dis[V],S,T;
  11.  
  12. struct line{
  13. int u,v,c,nt;
  14. }eg[E];
  15. int lt[V],sum=;
  16.  
  17. void adt(int u,int v,int c){
  18. eg[++sum].u=u; eg[sum].v=v; eg[sum].c=c; eg[sum].nt=lt[u]; lt[u]=sum;
  19. }
  20.  
  21. void add(int u,int v,int c){
  22. // printf("%d %d %d\n",u,v,c );
  23. adt(u,v,c); adt(v,u,);
  24. }
  25.  
  26. void init(){
  27. memset(lt,,sizeof(lt));
  28. sum=; ans=;
  29. }
  30.  
  31. bool bfs(){
  32. memset(dis,,sizeof(dis));
  33. dis[S]=;
  34. queue<int> Q;
  35. Q.push(S);
  36. while (!Q.empty()){
  37. int u=Q.front();
  38. Q.pop();
  39. for (int i=lt[u];i;i=eg[i].nt){
  40. int v=eg[i].v;
  41. if (eg[i].c && !dis[v]){
  42. dis[v]=dis[u]+;
  43. Q.push(v);
  44. }
  45. }
  46. }
  47. return dis[T]>;
  48. }
  49.  
  50. int dfs(int u,int flow){
  51. if (u==T) return flow;
  52. int res=,f;
  53. for (int i=lt[u];i;i=eg[i].nt){
  54. int v=eg[i].v;
  55. if (eg[i].c&&dis[v]==dis[u]+){
  56. f=dfs(v,min(flow-res,eg[i].c));
  57. res+=f;
  58. eg[i].c-=f;
  59. eg[i ^ ].c+=f;
  60. if (flow==res) break;
  61. }
  62. }
  63. if (!res) dis[u]=-;
  64. return res;
  65. }
  66.  
  67. int dinic(){
  68. int sum=;
  69. while (bfs()) sum+=dfs(S,INF);
  70. return sum;
  71. }
  72.  
  73. int main(){
  74.  
  75. int Tp,cas=,cnt;
  76. char s[];
  77. int a[],b[],w[][];
  78.  
  79. scanf("%d",&Tp);
  80. while (Tp--){
  81. init();
  82.  
  83. scanf("%d",&n);
  84. scanf("%s",s+);
  85. for (int i=;i<=;i++) scanf("%d%d",&a[i],&b[i]);
  86. for (int i=;i<=n;i++)
  87. for (int j=;j<=n;j++)
  88. {
  89. scanf("%d",&w[i][j]);
  90. ans+=w[i][j];
  91. }
  92. S=,T=n*(n-)/+n++,cnt=;
  93. for (int i=;i<=n;i++)
  94. for (int j=i+;j<=n;j++){
  95. cnt++;
  96. add(S,cnt,w[i][j]+w[j][i]);
  97. add(cnt,n*(n-)/+i,INF);
  98. add(cnt,n*(n-)/+j,INF);
  99. }
  100. for (int i=;i<=n;i++){
  101. add(n*(n-)/+i,n*(n-)/+n+s[i]-''+,INF);
  102. add(n*(n-)/+i,T,a[s[i]-'']);
  103. }
  104. for (int i=;i<=;i++)
  105. add(n*(n-)/+n+i+,T,(b[i]-a[i]));
  106. n=T;
  107. printf("Case #%d: %d\n",++cas,ans-dinic());
  108. }
  109. }

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. MongoDB 一对多关系建模

    转文: 本篇博客翻译自: http://blog.mongodb.org/post/87200945828/6-rules-of-thumb-for-mongodb-schema-design-par ...

  2. PHP可变长函数方法介绍

    1.三个重要函数 func_num_args()  返回实参个数 func_get_arg(i)    返回某个实参的值       func_get_args()        以数组的形式返回实参 ...

  3. ThoughtWorks微服务架构交流心得

      ThoughtWorks微服务架构交流心得: (1)<人月神话>中谈到软件开发没有银弹,根源在于软件所解决的领域问题本身固有的复杂性,微服务正是从领域问题角度上进行服务拆分,来降低软件 ...

  4. 数据库与SQL语言

    数据库(DB) :长期储存在计算机中.有组织.可共享的数据的集合. 特点:(1)数据按一定的数据模型组织.描述和储存:(2)较小的冗余度:(3)数据独立性较高:(4)易扩展:(5)可共享(不同用户可按 ...

  5. linux :TOP命令及参数解析

    第二行 分别显示:total进程总数. running正在运行的进程数. sleeping睡眠的进程数.stopped停止的进程数. zombie僵尸进程数. 第三行 分别显示: %us 用户空间占用 ...

  6. 第三章 XHTML 表单

    1.表单的主要作用在于在网页上提供一个图形用户界面,以采集和提交用户输入的数据. 2.HTML表单元素和属性可以分为两种类型:定义表单整体结构,使浏览器知道如何处理表单数据的元素:创建输入控件的元素. ...

  7. java正则表达式之java小爬虫

    这个java小爬虫, 功能很简单,只有一个,抓取网上的邮箱.用到了javaI/O,正则表达式. public static void main(String[] args) throws IOExce ...

  8. strstr strchr strrchr

    通过函数的定义来区分: 1.strstr: 返回子串出现的第一次位置 char *strstr(const char *haystack, const char *needle) 可见,strstr函 ...

  9. C-crash的方法

    #include <iostream> using namespace std; int main() { #if 0 //devide by 0 ; ; double d = i/j; ...

  10. poj 2536 GopherII(二分图匹配)

    Description The gopher family, having averted the canine threat, must face a new predator. The are n ...