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个花瓶,我们用美学值(一个整数)表示每束花放入每个花瓶所产生的美学 ...
随机推荐
- ORA-39006、ORA-39065、ORA-01403、ORA-39097错误解决办法
今天有同事找说是expdp到出数据时报错: 处理方法:sys用户下执行如下语句重新生成DATAPUMP API用到的视图问题就解决了. SQL> @?/rdbms/admin/catmeta.s ...
- 基于Nginx+FastDFS搭建图片文件系统
Nginx+fastdfs:https://www.cnblogs.com/chiangchou/p/fastdfs.html#_label0_1 缩略图:https://blog.csdn.net/ ...
- 理解本真的REST架构风格(转,解释的最清楚)
add by zhj start: Fielding在批判性继承前人研究成果的基础上,建立起来一整套研究和评价软件架构的方法论.这套方法论的核心是“架构风格”这个概念.架构风格是一种研究和评价软件架构 ...
- 监听checkbox事件
<!DOCTYPE html> <html> <head> <title></title> </head> <script ...
- 【Loadrunner】如何通过loadrunner利用代理对手机端Web浏览器及APP进行录制?
以下为作者操作并最终可以成功录制脚本并调试成功的方法实际操作中记录截图,都是干货哦~ 1.安装lr11补丁 百度网盘下载链接:https://pan.baidu.com/s/1TPoaAMYvi1cw ...
- mysql 表的增删改查 修改表结构
四.修改表结构 语法: . 修改表名 ALTER TABLE 表名 RENAME 新表名; . 增加字段 ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…], ADD 字段名 ...
- Java-idea-FindBugs、PMD和CheckStyle对比
一.对比 工具 目的 检查项 备注 FindBugs 检查.class 基于Bug Patterns概念,查找javabytecode (.class文件)中的潜在bug 主要检查bytecode中的 ...
- Centos7 Zabbix3.2安装
实验环境: 阿里云 [zabbix@miyan ~]$ cat /etc/redhat-release CentOS Linux release (Core) 不得不说,官方文档确实强大 1.官方文档 ...
- 模块讲解----configparser模块(my.cnf配置文件操作)
查询 1.所有节点: 2.指定节点下的所有key和values: 3.指定节点下所有的key: 4.指定节点和key下的values: # #configparser用于处理特定格式的文件,其本质上是 ...
- G.Finding the Radius for an Inserted Circle 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛
地址:https://nanti.jisuanke.com/t/17314 题目: Three circles C_{a}Ca, C_{b}Cb, and C_{c}Cc, all ...