wikioi 1028 花店橱窗布置 最大权匹配
中文题意不描述。
链接:http://wikioi.com/problem/1028/
这题一开始很裸的最大权二分匹配。但是原来没有接触过,KM的这个最大权不大会。然后一开始以为用最大费用最大流直接就能搞,后来知道单纯的费用流解决的是二分最佳匹配,而不是最大权,QCMM然后看了一下这个http://hi.baidu.com/lerroy312/item/42e718ba58a1f8df85dd795f
结果改了之后不对,不知道为什么最后用的最小费用,对边的权值取负值,结果取负值才过。。。不解。。。
- #include <iostream>
- #include <queue>
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <vector>
- using namespace std;
- const int maxn = ;
- const int inf = ;
- struct node
- {
- int u,v,cap,flow,cost,next;
- }edges[];
- int head[maxn],cnt;
- void init(int n)
- {
- int i;
- for(i = ;i <= n;i++)
- head[i] = -;
- cnt = ;
- return ;
- }
- void addedge(int u,int v,int cap,int cost)
- {
- edges[cnt].u = u;
- edges[cnt].v = v;
- edges[cnt].cap = cap;
- edges[cnt].flow = ;
- edges[cnt].cost = cost;
- edges[cnt].next = head[u];
- head[u] = cnt;
- cnt++;
- edges[cnt].u = v;
- edges[cnt].v = u;
- edges[cnt].cap = ;
- edges[cnt].flow = ;
- edges[cnt].cost = -cost;
- edges[cnt].next = head[v];
- head[v] = cnt;
- cnt++;
- }
- int vis[maxn],a[maxn],pre[maxn],dis[maxn];
- int spfa(int s,int t,int n,int &flow,int &cost)
- {
- int i;
- queue<int> q;
- for(i = ;i <= n ;i++)
- dis[i] = inf,vis[i] = ;
- dis[s] = ;
- pre[s] = ;
- vis[s] = ;
- a[s] = inf;
- int u,v;
- q.push(s);
- while(!q.empty())
- {
- u = q.front();
- q.pop();
- vis[u] = ;
- for(i = head[u];i != -;i = edges[i].next)
- {
- struct node & e = edges[i];
- v = e.v;
- if(e.cap > e.flow &&dis[v] > dis[u]+e.cost)
- {
- dis[v] = dis[u]+e.cost;
- a[v] = min(a[u],e.cap-e.flow);
- pre[v] = i;
- if(!vis[v])
- {
- vis[v] = ;
- q.push(v);
- }
- }
- }
- }
- if(dis[t] >= inf)
- return ;
- flow+= a[t];
- cost += dis[t]*a[t];
- u = t;
- while(u != s)
- {
- edges[pre[u]].flow += a[t];
- edges[pre[u]^].flow -= a[t];
- u = edges[pre[u]].u;
- }
- return ;
- }
- int mcmf(int s,int t, int n)
- {
- int cost = ,flow = ;
- while(spfa(s,t,n,flow,cost));
- return cost;
- }
- int main()
- {
- int n,m;
- scanf("%d %d",&n,&m);
- int i,j;
- init(n+m+);
- for(i =;i <= n;i++)
- {
- addedge(,i,,);
- for(j = ;j <= m;j++)
- {
- int w;
- scanf("%d",&w);
- addedge(i,j+n,,-w);
- }
- addedge(i,m+n+,,);
- }
- addedge(n+m+,m+n+,n,);
- for(j = ;j <= m;j++)
- addedge(j+n,m+n+,,);
- cout<<-mcmf(,m+n+,m+n+)<<endl;
- return ;
- }
额,最近跟scu-frog神请教了下这个问题,scu-frog神看了下代码,说你的最长路的初始化有问题,有负权边为什么赋值-1.
然后默默对自己说了一句sb。。。默默改了交了一下,ac= =。
- #include <iostream>
- #include <queue>
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <vector>
- using namespace std;
- const int maxn = ;
- const int inf = ;
- struct node
- {
- int u,v,cap,flow,cost,next;
- }edges[];
- int head[maxn],cnt;
- void init(int n)
- {
- int i;
- for(i = ;i <= n;i++)
- head[i] = -;
- cnt = ;
- return ;
- }
- void addedge(int u,int v,int cap,int cost)
- {
- edges[cnt].u = u;
- edges[cnt].v = v;
- edges[cnt].cap = cap;
- edges[cnt].flow = ;
- edges[cnt].cost = cost;
- edges[cnt].next = head[u];
- head[u] = cnt;
- cnt++;
- edges[cnt].u = v;
- edges[cnt].v = u;
- edges[cnt].cap = ;
- edges[cnt].flow = ;
- edges[cnt].cost = -cost;
- edges[cnt].next = head[v];
- head[v] = cnt;
- cnt++;
- }
- int vis[maxn],a[maxn],pre[maxn],dis[maxn];
- int spfa(int s,int t,int n,int &flow,int &cost)
- {
- int i;
- queue<int> q;
- for(i = ;i <= n ;i++)
- dis[i] = -inf,vis[i] = ;
- dis[s] = ;
- pre[s] = ;
- vis[s] = ;
- a[s] = inf;
- int u,v;
- q.push(s);
- while(!q.empty())
- {
- u = q.front();
- q.pop();
- vis[u] = ;
- for(i = head[u];i != -;i = edges[i].next)
- {
- struct node & e = edges[i];
- v = e.v;
- if(e.cap > e.flow &&dis[v] < dis[u]+e.cost)
- {
- dis[v] = dis[u]+e.cost;
- a[v] = min(a[u],e.cap-e.flow);
- pre[v] = i;
- if(!vis[v])
- {
- vis[v] = ;
- q.push(v);
- }
- }
- }
- }
- if(dis[t] <= -inf)
- return ;
- flow+= a[t];
- cost += dis[t]*a[t];
- u = t;
- while(u != s)
- {
- edges[pre[u]].flow += a[t];
- edges[pre[u]^].flow -= a[t];
- u = edges[pre[u]].u;
- }
- return ;
- }
- int mcmf(int s,int t, int n)
- {
- int cost = ,flow = ;
- while(spfa(s,t,n,flow,cost));
- return cost;
- }
- int main()
- {
- int n,m;
- scanf("%d %d",&n,&m);
- int i,j;
- init(n+m+);
- for(i =;i <= n;i++)
- {
- addedge(,i,,);
- for(j = ;j <= m;j++)
- {
- int w;
- scanf("%d",&w);
- addedge(i,j+n,,w);
- }
- addedge(i,m+n+,,);
- }
- addedge(n+m+,m+n+,n,);
- for(j = ;j <= m;j++)
- addedge(j+n,m+n+,,);
- cout<<mcmf(,m+n+,m+n+)<<endl;
- return ;
- }
wikioi 1028 花店橱窗布置 最大权匹配的更多相关文章
- codevs 1028 花店橱窗布置
时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 假设以最美观的方式布置花店的橱窗,有F束花,V个花瓶,我们用美学值(一个整 ...
- codevs 1028 花店橱窗布置 (KM)
/*裸地KM*/ #include<iostream> #include<cstdio> #include<cstring> #define maxn 110 #d ...
- codevs 1028 花店橱窗布置 KM算法
题目链接 n个花, m个花瓶, 每个花放到一个花瓶里会产生一个值w[i][j], 一个花只能放到一个花瓶里, 一个花瓶只能放一个花, 求产生的最大值. 带权二分图模板. #include <io ...
- [IOI1999]花店橱窗布置(DP路径记录)
题目:[IOI1999]花店橱窗布置 问题编号:496 题目描述 某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定的,从左到右按1到V顺序编号,V ...
- 洛谷P1854 花店橱窗布置 分析+题解代码
洛谷P1854 花店橱窗布置 分析+题解代码 蒟蒻的第一道提高+/省选-,纪念一下. 题目描述: 某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定 ...
- RQNOJ PID496/[IOI1999]花店橱窗布置
PID496 / [IOI1999]花店橱窗布置 ☆ 题目描述 某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定的,从左到右按1到V顺序 编号 ...
- 【2018寒假集训 Day2】【2019.5.11更新】【动态规划】花店橱窗布置(FLOWER)
花店橱窗布置(FLOWER) 提交文件名:flower 问题描述: 某花店现有F束花,每一束花的品种都不一样,同时至少有同样数量的花瓶,被按顺序摆成一行,花瓶的位置是固定的,从左到右按1到V顺序编号, ...
- codevs1028花店橱窗布置(费用流)
这几天刚学了费用流,找到了这道题来练一练手. 题目: 题目描述 Description 假设以最美观的方式布置花店的橱窗,有F束花,V个花瓶,我们用美学值(一个整数)表示每束花放入每个花瓶所产生的美学 ...
- 【codevs1028】花店橱窗布置(费用流)
这几天刚学了费用流,找到了这道题来练一练手. 题目: 题目描述 Description 假设以最美观的方式布置花店的橱窗,有F束花,V个花瓶,我们用美学值(一个整数)表示每束花放入每个花瓶所产生的美学 ...
随机推荐
- Oracle Schema Objects——伪列ROWID Pseudocolumn(ROWNUM、ROWID)
Oracle Schema Objects Oracle Schema Objects——Tables——Oracle Data Types Oracle伪列 在Oracle数据库之中为了实现完整的关 ...
- Database Sharding, The “Shared-Nothing” Approach DATABASE SHARDING
w将单个服务器上的单个数据库打碎为多个服务器上的单个数据库 http://www.agildata.com/database-sharding/ Database Sharding provides ...
- umlの交互图
版权声明:本文为博主原创文章,若要转载请注明出处!^_^ https://blog.csdn.net/u010892841/article/details/24920155 前面介绍了uml的非常多种 ...
- React Native入门-刘望舒
React Native入门(一)环境搭建与Hello World React Native入门(二)Atom+Nuclide安装.配置与调试 React Native入门(三)组件的Props(属性 ...
- Teigha.net读写dwg文件显示
官网:http://www.opendesign.com/ http://www.cnblogs.com/zhanglibo0626/archive/2011/11/04/2236238.html 下 ...
- django之中间件、缓存、信号、admin内置后台
目录: 中间件 缓存 信号 admin后台 一.中间件 1.什么是中间件? 中间件是一个.一个的管道,如果相对任何所有的通过Django的请求进行管理都需要自定义中间件 中间件可以对进来的请求和出去的 ...
- POJ2195:Going Home(费用流入门)
http://poj.org/problem?id=2195 #include <iostream> #include <stdio.h> #include <strin ...
- testng日志和报告
TestNG是通过 Listeners 或者 Reporters 生成测试报告. Listeners,即 org.testng.ITestListener 的实现,能够在测试执行过程中发出各种测试结果 ...
- 【深入理解JVM】:类加载器与双亲委派模型
类加载器 加载类的开放性 类加载器(ClassLoader)是Java语言的一项创新,也是Java流行的一个重要原因.在类加载的第一阶段“加载”过程中,需要通过一个类的全限定名来获取定义此类的二进制字 ...
- js文件被浏览器缓存
如果修改了js文件中的js代码,发布代码到线上后.用户的浏览器使用的还是原来js缓存.所以并不会马上生效. 如何才能让浏览器使用最新的js文件呢? 我去看了一下淘宝,发现也是这样一种方式额,不知道对不 ...