中文题意不描述。

链接:http://wikioi.com/problem/1028/

这题一开始很裸的最大权二分匹配。但是原来没有接触过,KM的这个最大权不大会。然后一开始以为用最大费用最大流直接就能搞,后来知道单纯的费用流解决的是二分最佳匹配,而不是最大权,QCMM然后看了一下这个http://hi.baidu.com/lerroy312/item/42e718ba58a1f8df85dd795f

结果改了之后不对,不知道为什么最后用的最小费用,对边的权值取负值,结果取负值才过。。。不解。。。

  1. #include <iostream>
  2. #include <queue>
  3. #include <iostream>
  4. #include <cstdio>
  5. #include <cstring>
  6. #include <vector>
  7. using namespace std;
  8. const int maxn = ;
  9. const int inf = ;
  10. struct node
  11. {
  12. int u,v,cap,flow,cost,next;
  13. }edges[];
  14. int head[maxn],cnt;
  15. void init(int n)
  16. {
  17. int i;
  18. for(i = ;i <= n;i++)
  19. head[i] = -;
  20. cnt = ;
  21.  
  22. return ;
  23. }
  24. void addedge(int u,int v,int cap,int cost)
  25. {
  26. edges[cnt].u = u;
  27. edges[cnt].v = v;
  28. edges[cnt].cap = cap;
  29. edges[cnt].flow = ;
  30. edges[cnt].cost = cost;
  31. edges[cnt].next = head[u];
  32. head[u] = cnt;
  33. cnt++;
  34. edges[cnt].u = v;
  35. edges[cnt].v = u;
  36. edges[cnt].cap = ;
  37. edges[cnt].flow = ;
  38. edges[cnt].cost = -cost;
  39. edges[cnt].next = head[v];
  40. head[v] = cnt;
  41. cnt++;
  42. }
  43. int vis[maxn],a[maxn],pre[maxn],dis[maxn];
  44. int spfa(int s,int t,int n,int &flow,int &cost)
  45. {
  46. int i;
  47. queue<int> q;
  48. for(i = ;i <= n ;i++)
  49. dis[i] = inf,vis[i] = ;
  50.  
  51. dis[s] = ;
  52. pre[s] = ;
  53. vis[s] = ;
  54. a[s] = inf;
  55.  
  56. int u,v;
  57. q.push(s);
  58.  
  59. while(!q.empty())
  60. {
  61. u = q.front();
  62. q.pop();
  63. vis[u] = ;
  64.  
  65. for(i = head[u];i != -;i = edges[i].next)
  66. {
  67. struct node & e = edges[i];
  68.  
  69. v = e.v;
  70. if(e.cap > e.flow &&dis[v] > dis[u]+e.cost)
  71. {
  72. dis[v] = dis[u]+e.cost;
  73. a[v] = min(a[u],e.cap-e.flow);
  74. pre[v] = i;
  75. if(!vis[v])
  76. {
  77. vis[v] = ;
  78. q.push(v);
  79. }
  80. }
  81. }
  82. }
  83.  
  84. if(dis[t] >= inf)
  85. return ;
  86. flow+= a[t];
  87. cost += dis[t]*a[t];
  88. u = t;
  89. while(u != s)
  90. {
  91. edges[pre[u]].flow += a[t];
  92. edges[pre[u]^].flow -= a[t];
  93. u = edges[pre[u]].u;
  94. }
  95. return ;
  96. }
  97. int mcmf(int s,int t, int n)
  98. {
  99. int cost = ,flow = ;
  100. while(spfa(s,t,n,flow,cost));
  101.  
  102. return cost;
  103. }
  104. int main()
  105. {
  106. int n,m;
  107. scanf("%d %d",&n,&m);
  108.  
  109. int i,j;
  110. init(n+m+);
  111. for(i =;i <= n;i++)
  112. {
  113. addedge(,i,,);
  114. for(j = ;j <= m;j++)
  115. {
  116. int w;
  117. scanf("%d",&w);
  118. addedge(i,j+n,,-w);
  119. }
  120. addedge(i,m+n+,,);
  121. }
  122. addedge(n+m+,m+n+,n,);
  123. for(j = ;j <= m;j++)
  124. addedge(j+n,m+n+,,);
  125. cout<<-mcmf(,m+n+,m+n+)<<endl;
  126. return ;
  127. }

额,最近跟scu-frog神请教了下这个问题,scu-frog神看了下代码,说你的最长路的初始化有问题,有负权边为什么赋值-1.

然后默默对自己说了一句sb。。。默默改了交了一下,ac= =。

  1. #include <iostream>
  2. #include <queue>
  3. #include <iostream>
  4. #include <cstdio>
  5. #include <cstring>
  6. #include <vector>
  7. using namespace std;
  8. const int maxn = ;
  9. const int inf = ;
  10. struct node
  11. {
  12. int u,v,cap,flow,cost,next;
  13. }edges[];
  14. int head[maxn],cnt;
  15. void init(int n)
  16. {
  17. int i;
  18. for(i = ;i <= n;i++)
  19. head[i] = -;
  20. cnt = ;
  21.  
  22. return ;
  23. }
  24. void addedge(int u,int v,int cap,int cost)
  25. {
  26. edges[cnt].u = u;
  27. edges[cnt].v = v;
  28. edges[cnt].cap = cap;
  29. edges[cnt].flow = ;
  30. edges[cnt].cost = cost;
  31. edges[cnt].next = head[u];
  32. head[u] = cnt;
  33. cnt++;
  34. edges[cnt].u = v;
  35. edges[cnt].v = u;
  36. edges[cnt].cap = ;
  37. edges[cnt].flow = ;
  38. edges[cnt].cost = -cost;
  39. edges[cnt].next = head[v];
  40. head[v] = cnt;
  41. cnt++;
  42. }
  43. int vis[maxn],a[maxn],pre[maxn],dis[maxn];
  44. int spfa(int s,int t,int n,int &flow,int &cost)
  45. {
  46. int i;
  47. queue<int> q;
  48. for(i = ;i <= n ;i++)
  49. dis[i] = -inf,vis[i] = ;
  50.  
  51. dis[s] = ;
  52. pre[s] = ;
  53. vis[s] = ;
  54. a[s] = inf;
  55.  
  56. int u,v;
  57. q.push(s);
  58.  
  59. while(!q.empty())
  60. {
  61. u = q.front();
  62. q.pop();
  63. vis[u] = ;
  64.  
  65. for(i = head[u];i != -;i = edges[i].next)
  66. {
  67. struct node & e = edges[i];
  68.  
  69. v = e.v;
  70. if(e.cap > e.flow &&dis[v] < dis[u]+e.cost)
  71. {
  72. dis[v] = dis[u]+e.cost;
  73. a[v] = min(a[u],e.cap-e.flow);
  74. pre[v] = i;
  75. if(!vis[v])
  76. {
  77. vis[v] = ;
  78. q.push(v);
  79. }
  80. }
  81. }
  82. }
  83.  
  84. if(dis[t] <= -inf)
  85. return ;
  86. flow+= a[t];
  87. cost += dis[t]*a[t];
  88. u = t;
  89. while(u != s)
  90. {
  91. edges[pre[u]].flow += a[t];
  92. edges[pre[u]^].flow -= a[t];
  93. u = edges[pre[u]].u;
  94. }
  95. return ;
  96. }
  97. int mcmf(int s,int t, int n)
  98. {
  99. int cost = ,flow = ;
  100. while(spfa(s,t,n,flow,cost));
  101.  
  102. return cost;
  103. }
  104. int main()
  105. {
  106. int n,m;
  107. scanf("%d %d",&n,&m);
  108.  
  109. int i,j;
  110. init(n+m+);
  111. for(i =;i <= n;i++)
  112. {
  113. addedge(,i,,);
  114. for(j = ;j <= m;j++)
  115. {
  116. int w;
  117. scanf("%d",&w);
  118. addedge(i,j+n,,w);
  119. }
  120. addedge(i,m+n+,,);
  121. }
  122. addedge(n+m+,m+n+,n,);
  123. for(j = ;j <= m;j++)
  124. addedge(j+n,m+n+,,);
  125. cout<<mcmf(,m+n+,m+n+)<<endl;
  126. return ;
  127. }

wikioi 1028 花店橱窗布置 最大权匹配的更多相关文章

  1. codevs 1028 花店橱窗布置

    时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题目描述 Description 假设以最美观的方式布置花店的橱窗,有F束花,V个花瓶,我们用美学值(一个整 ...

  2. codevs 1028 花店橱窗布置 (KM)

    /*裸地KM*/ #include<iostream> #include<cstdio> #include<cstring> #define maxn 110 #d ...

  3. codevs 1028 花店橱窗布置 KM算法

    题目链接 n个花, m个花瓶, 每个花放到一个花瓶里会产生一个值w[i][j], 一个花只能放到一个花瓶里, 一个花瓶只能放一个花, 求产生的最大值. 带权二分图模板. #include <io ...

  4. [IOI1999]花店橱窗布置(DP路径记录)

    题目:[IOI1999]花店橱窗布置 问题编号:496 题目描述 某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定的,从左到右按1到V顺序编号,V ...

  5. 洛谷P1854 花店橱窗布置 分析+题解代码

    洛谷P1854 花店橱窗布置 分析+题解代码 蒟蒻的第一道提高+/省选-,纪念一下. 题目描述: 某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定 ...

  6. RQNOJ PID496/[IOI1999]花店橱窗布置

    PID496 / [IOI1999]花店橱窗布置 ☆   题目描述 某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定的,从左到右按1到V顺序 编号 ...

  7. 【2018寒假集训 Day2】【2019.5.11更新】【动态规划】花店橱窗布置(FLOWER)

    花店橱窗布置(FLOWER) 提交文件名:flower 问题描述: 某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定的,从左到右按1到V顺序编号, ...

  8. codevs1028花店橱窗布置(费用流)

    这几天刚学了费用流,找到了这道题来练一练手. 题目: 题目描述 Description 假设以最美观的方式布置花店的橱窗,有F束花,V个花瓶,我们用美学值(一个整数)表示每束花放入每个花瓶所产生的美学 ...

  9. 【codevs1028】花店橱窗布置(费用流)

    这几天刚学了费用流,找到了这道题来练一练手. 题目: 题目描述 Description 假设以最美观的方式布置花店的橱窗,有F束花,V个花瓶,我们用美学值(一个整数)表示每束花放入每个花瓶所产生的美学 ...

随机推荐

  1. Oracle Schema Objects——伪列ROWID Pseudocolumn(ROWNUM、ROWID)

    Oracle Schema Objects Oracle Schema Objects——Tables——Oracle Data Types Oracle伪列 在Oracle数据库之中为了实现完整的关 ...

  2. Database Sharding, The “Shared-Nothing” Approach DATABASE SHARDING

    w将单个服务器上的单个数据库打碎为多个服务器上的单个数据库 http://www.agildata.com/database-sharding/ Database Sharding provides ...

  3. umlの交互图

    版权声明:本文为博主原创文章,若要转载请注明出处!^_^ https://blog.csdn.net/u010892841/article/details/24920155 前面介绍了uml的非常多种 ...

  4. React Native入门-刘望舒

    React Native入门(一)环境搭建与Hello World React Native入门(二)Atom+Nuclide安装.配置与调试 React Native入门(三)组件的Props(属性 ...

  5. Teigha.net读写dwg文件显示

    官网:http://www.opendesign.com/ http://www.cnblogs.com/zhanglibo0626/archive/2011/11/04/2236238.html 下 ...

  6. django之中间件、缓存、信号、admin内置后台

    目录: 中间件 缓存 信号 admin后台 一.中间件 1.什么是中间件? 中间件是一个.一个的管道,如果相对任何所有的通过Django的请求进行管理都需要自定义中间件 中间件可以对进来的请求和出去的 ...

  7. POJ2195:Going Home(费用流入门)

    http://poj.org/problem?id=2195 #include <iostream> #include <stdio.h> #include <strin ...

  8. testng日志和报告

    TestNG是通过 Listeners 或者 Reporters 生成测试报告. Listeners,即 org.testng.ITestListener 的实现,能够在测试执行过程中发出各种测试结果 ...

  9. 【深入理解JVM】:类加载器与双亲委派模型

    类加载器 加载类的开放性 类加载器(ClassLoader)是Java语言的一项创新,也是Java流行的一个重要原因.在类加载的第一阶段“加载”过程中,需要通过一个类的全限定名来获取定义此类的二进制字 ...

  10. js文件被浏览器缓存

    如果修改了js文件中的js代码,发布代码到线上后.用户的浏览器使用的还是原来js缓存.所以并不会马上生效. 如何才能让浏览器使用最新的js文件呢? 我去看了一下淘宝,发现也是这样一种方式额,不知道对不 ...