【UOJ 80】 二分图最大权匹配

【分析】
之前打的那种KM会TLE。。。
why??明明说n^3的啊?
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
#define Maxn 410
#define Maxm 160010
// #define INF 0x7fffffff
#define LL long long
const LL INF=1LL<<; LL mymin(LL x,LL y) {return x<y?x:y;}
LL mymax(LL x,LL y) {return x>y?x:y;} int N; int n,m;
int match[Maxn],op[Maxn];
LL eg[Maxn][Maxn],lx[Maxn],ly[Maxn],slack[Maxn];
int visx[Maxn],visy[Maxn],pre[Maxn]; void mh(int y)
{
for(int x,z;y>;y=z)
{
x=pre[y];z=op[x];
op[x]=y;match[y]=x;
}
} int nt;
void ffind(int st)
{
for(int i=;i<=N;i++) slack[i]=INF;
queue<int> q;nt++;
q.push(st);visx[st]=nt;
while ()
{
while(!q.empty())
{
int x=q.front();q.pop();
for(int y=;y<=N;y++)
if(visy[y]!=nt)
{
if(lx[x]+ly[y]==eg[x][y])
{
pre[y]=x;
if(!match[y]) {mh(y);return;}
q.push(match[y]);
visx[match[y]]=nt;visy[y]=nt;
}
else if(slack[y]>lx[x]+ly[y]-eg[x][y])
slack[y]=lx[x]+ly[y]-eg[x][y],pre[y]=x;
}
}
LL delta=INF;
for(int y=;y<=N;y++) if(visy[y]!=nt) delta=mymin(delta,slack[y]);
for(int i=;i<=N;i++)
{
if(visx[i]==nt) lx[i]-=delta;
if(visy[i]==nt) ly[i]+=delta;
else slack[i]-=delta;
}
for(int i=;i<=N;i++) if(visy[i]!=nt&&slack[i]==)
{
if(!match[i]) {mh(i);return;}
q.push(match[i]);
visx[match[i]]=nt;visy[i]=nt;
}
}
} LL KM()
{
memset(visx,,sizeof(visx));
memset(visy,,sizeof(visy));
for (int i=;i<=N;i++) lx[i]=ly[i]=,op[i]=match[i]=;
for (int i=;i<=N;i++)
for (int j=;j<=N;j++)
lx[i]=mymax(lx[i],eg[i][j]);
for (int i=;i<=N;i++) ffind(i);
} void output()
{
LL ans=;
for(int i=;i<=N;i++) ans+=lx[i]+ly[i];
printf("%lld\n",ans);
for(int i=;i<=n;i++) if(eg[i][op[i]]!=) printf("%d ",op[i]);
else printf("0 ");printf("\n");
} void init()
{
int l;
memset(eg,,sizeof(eg));
scanf("%d%d%d",&n,&m,&l);
for(int i=;i<=l;i++)
{
int x,y;
LL c;
scanf("%d%d%lld",&x,&y,&c);
eg[x][y]=mymax(eg[x][y],c);
}
N=mymax(n,m);
} int main()
{
init();
KM();
output();
return ;
}
【UOJ 80】 二分图最大权匹配的更多相关文章
- UOJ#80. 二分图最大权匹配 模板
#80. 二分图最大权匹配 描述 提交 自定义测试 从前一个和谐的班级,有 nlnl 个是男生,有 nrnr 个是女生.编号分别为 1,…,nl1,…,nl 和 1,…,nr1,…,nr. 有若干个这 ...
- uoj#80 二分图最大权匹配
题意:给定二分图,有边权,求最大边权匹配.边权非负. 解:KM算法求解最大权完备匹配. 完备匹配就是点数少的那一边每个点都有匹配. 为了让完备匹配与最大权匹配等价,我们添加若干条0边使之成为完全二分图 ...
- UOJ#80 二分图最大权匹配 [模板题]
从前一个和谐的班级,有 nlnl 个是男生,有 nrnr 个是女生.编号分别为 1,…,nl1,…,nl 和 1,…,nr1,…,nr. 有若干个这样的条件:第 vv 个男生和第 uu 个女生愿意结为 ...
- @noi.ac - 507@ 二分图最大权匹配
目录 @description@ @solution@ @accepted code@ @details@ @description@ 有一天你学了一个能解决二分图最大权匹配的算法,你决定将这个算法应 ...
- [ACM] HDU 2255 奔小康赚大钱 (二分图最大权匹配,KM算法)
奔小康赚大钱 Problem Description 传说在遥远的地方有一个很富裕的村落,有一天,村长决定进行制度改革:又一次分配房子. 这但是一件大事,关系到人民的住房问题啊. 村里共同拥有n间房间 ...
- [hdu1533]二分图最大权匹配 || 最小费用最大流
题意:给一个n*m的地图,'m'表示人,'H'表示房子,求所有人都回到房子所走的距离之和的最小值(距离为曼哈顿距离). 思路:比较明显的二分图最大权匹配模型,将每个人向房子连一条边,边权为曼哈顿距离的 ...
- POJ2195 Going Home[费用流|二分图最大权匹配]
Going Home Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 22088 Accepted: 11155 Desc ...
- Hdu2255 奔小康赚大钱(二分图最大权匹配KM算法)
奔小康赚大钱 Problem Description 传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子. 这可是一件大事,关系到人民的住房问题啊.村里共有n间房间,刚好 ...
- POJ2195 Going Home (最小费最大流||二分图最大权匹配) 2017-02-12 12:14 131人阅读 评论(0) 收藏
Going Home Description On a grid map there are n little men and n houses. In each unit time, every l ...
- HDU2255 奔小康赚大钱 —— 二分图最大权匹配 KM算法
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2255 奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others) ...
随机推荐
- TreeSet的特性
TreeSet在Set的元素不重复的基础之上引入排序的概念,其中对自身拥有Comparable的元素,可以直接进行排序,比如字符串,按照字母的自然顺序排序,此处说下对于自定义对象排序的方式. 1.存储 ...
- java规范之checkstyle
1. 概述 随着中心的代码规范的建立和实施,项目组对代码规范要求,以及软件工程师们对自身代码的编写规范重要性的认知,“代码规范”已经成为了中心的一个“热词”.然后怎么才能写出有规范的代码,怎么才能养成 ...
- 【leetcode 简单】第三十九题 Excel表列名称
给定一个正整数,返回它在 Excel 表中相对应的列名称. 例如, 1 -> A 2 -> B 3 -> C ... 26 -> Z 27 -> AA 28 -> ...
- grep 中的正则表达式【转】
正则表达式 正则表达式就是用于匹配每行输入的一种模式,模式是指一串字符序列.下面是范例: ^w1 w1|w2 [^ ] grep 正则表达式示例 在 /etc/passswd 目录中搜索 'vivek ...
- Android 开发笔记(二)菜单设计
菜单设计一 // 创建菜单 public boolean onCreateOptionsMenu(Menu menu) { menu.add(0, 0, 0, "关于"); men ...
- 设置Git远程仓库
1,注册一个GitHub账户,登陆GitHub账户,添加一个储存库 2,进入Ubuntu命令窗口,创建文件夹.如 mkdir git echo "# first_git" ...
- Linux下不能挂载NTFS格式硬盘/U盘
如果大家以后在Ubuntu系统下面遇到NTFS格式的移动硬盘哪个分区不能挂载的话,可以尝试sudo ntfsfix /dev/你相应的分区
- 查看wtmp(登陆信息的内容)
/var/log/wtmp文件的作用 /var/log/wtmp也是一个二进制文件,记录每个用户的登录次数和持续时间等信息. 查看方法: 可以用last命令输出当中内容: debi ...
- Jinja2 及 render_template 的深度用法
是时候开始写个前端了,Flask中默认的模板语言是Jinja2 现在我们来一步一步的学习一下 Jinja2 捎带手把 render_template 中留下的疑问解决一下 首先我们要在后端定义几个字符 ...
- Codeforces 813B The Golden Age(数学+枚举)
题目大意:如果一个数t=x^a+y^b(a,b都是大于等于0的整数)那就是一个unlucky数字.给你x,y,l,r(2 ≤ x, y ≤ 10^18, 1 ≤ l ≤ r ≤ 10^18),求出l到 ...