最大流增广路(KM算法) HDOJ 1853 Cyclic Tour
/*
KM: 相比HDOJ_1533,多了重边的处理,还有完美匹配的判定方法
*/
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
using namespace std; const int MAXN = 1e2 + ;
const int INF = 0x3f3f3f3f;
int x[MAXN], y[MAXN];
int w[MAXN][MAXN];
int visx[MAXN], visy[MAXN];
int ly[MAXN];
int n, m, d; bool DFS(int u) {
visx[u] = true;
for (int i=; i<=n; ++i) {
if (!visy[i] && x[u] + y[i] == w[u][i]) {
visy[i] = true;
if (ly[i] == - || DFS (ly[i])) {
ly[i] = u; return true;
}
}
else if (x[u] + y[i] > w[u][i]) d = min (d, x[u] + y[i] - w[u][i]);
}
return false;
} int KM(void) {
for (int i=; i<=n; ++i) {
x[i] = -INF;
for (int j=; j<=n; ++j) {
x[i] = max (x[i], w[i][j]);
}
} memset (ly, -, sizeof (ly));
memset (y, , sizeof (y));
for (int i=; i<=n; ++i) {
while (true) {
memset (visx, false, sizeof (visx));
memset (visy, false, sizeof (visy));
d = INF;
if (DFS (i)) break;
for (int i=; i<=n; ++i) {
if (visx[i]) x[i] -= d;
}
for (int j=; j<=n; ++j) {
if (visy[j]) y[j] += d;
}
}
} for (int i=; i<=n; ++i) {
if (ly[i] == - || w[ly[i]][i] == -INF) return -;
} int res = ;
for (int i=; i<=n; ++i) {
res += x[i] + y[i];
} return -res;
} int main(void) { //HDOJ 1853 Cyclic Tour
//freopen ("HDOJ_1853.in", "r", stdin); while (scanf ("%d%d", &n, &m) == ) {
if (!n && !m) break;
for (int i=; i<=n; ++i) {
for (int j=; j<=n; ++j) w[i][j] = -INF;
}
for (int i=; i<=m; ++i) {
int u, v, c; scanf ("%d%d%d", &u, &v, &c);
if (-c > w[u][v]) w[u][v] = -c;
}
printf ("%d\n", KM ());
} return ;
}
最大流增广路(KM算法) HDOJ 1853 Cyclic Tour的更多相关文章
- 最大流增广路(KM算法) HDOJ 2255 奔小康赚大钱
题目传送门 /* KM:裸题第一道,好像就是hungary的升级版,不好理解,写点注释 KM算法用来解决最大权匹配问题: 在一个二分图内,左顶点为X,右顶点为Y,现对于每组左右连接Xi,Yj有权w(i ...
- 最大流增广路(KM算法) HDOJ 1533 Going Home
题目传送门 /* 最小费用流:KM算法是求最大流,只要w = -w就可以了,很经典的方法 */ #include <cstdio> #include <cmath> #incl ...
- hdu 3549 Flow Problem【最大流增广路入门模板题】
题目:http://acm.hdu.edu.cn/showproblem.php?pid=3549 Flow Problem Time Limit: 5000/5000 MS (Java/Others ...
- Power Network (最大流增广路算法模板题)
Time Limit: 2000MS Memory Limit: 32768K Total Submissions: 20754 Accepted: 10872 Description A p ...
- 网络最大流最短增广路Dinic算法模板
#include<cstdio> #include<cstring> #include<string> #include<cmath> #include ...
- 网络最大流增广路模板(EK & Dinic)
EK算法: int fir[maxn]; int u[maxm],v[maxm],cap[maxm],flow[maxm],nex[maxm]; int e_max; int p[maxn],q[ma ...
- 一般增广路方法求网络最大流(Ford-Fulkerson算法)
/* Time:2015-6-18 接触网络流好几天了 写的第一个模版————Ford-Fulkerson算法 作用:求解网络最大流 注意:源点是0 汇点是1 如果题目输入的是1到n 请预处理减1 * ...
- 网络流初步:<最大流>——核心(增广路算法)(模板)
增广路的核心就是引入了反向边,使在进行道路探索选择的时候增加了类似于退路的东西[有一点dp的味道??] 具体操作就是:1.首先使用结构体以及数组链表next[ MAXN ]进行边信息的存储 2.[核心 ...
- HDU3549 Flow Problem(网络流增广路算法)
题目链接. 分析: 网络流增广路算法模板题.http://www.cnblogs.com/tanhehe/p/3234248.html AC代码: #include <iostream> ...
随机推荐
- ehcache、memcache、redis三大缓存比较
最近项目组有用到这三个缓存,去各自的官方看了下,觉得还真的各有千秋!今天特意归纳下各个缓存的优缺点,仅供参考! Ehcache 在Java项目广泛的使用.它是一个开源的.设计于提高在数据从RDBMS ...
- Servlet表单数据处理
以下内容引用自http://wiki.jikexueyuan.com/project/servlet/form-data.html: 当需要从浏览器到Web服务器传递一些信息并最终传回到后台程序时,一 ...
- MongoDB小结04 - update【$inc】
update方法很强大,它有两个参数,一是查询文档,用来找出需要更新的文档,另一个是修改器(modifier)文档,描述对找到的文档做哪些修改. 亮点 更新操作是原子的,若两个更新同时发生,先到达服务 ...
- 【Hibernate】Hibernate的多表查询
在<[Hibernate]Hibernate的聚类查询.分组查询.排序与时间之差>(点击打开链接)一文中已经讲述过怎样利用HQL语句代替SQL语句.进行聚类查询.分组查询.排序与时间之差的 ...
- Django打造大型企业官网(一)
一.nvm的安装 (1)下载:nvm1.16 (2)安装完成后添加环境变量 C:\Users\Administrator\AppData\Roaming\nvm (3)修改settings.txt,将 ...
- linux句柄泄露问题查看
背景: 我们在开发linux在线server的时候常常会遇会句柄泄露的问题.由于在linux系统设计里面遵循一切都是文件的原则.即磁盘文件.文件夹.网络套接字.磁盘.管道等,全部这些都是文件.在我们进 ...
- lydsy1013: [JSOI2008]球形空间产生器sphere 高斯消元
题链:http://www.lydsy.com/JudgeOnline/problem.php?id=1013 1013: [JSOI2008]球形空间产生器sphere 时间限制: 1 Sec 内 ...
- 另类创业招聘(REV#2)
项目一 项目名:苏格拉底网 项目性质:人才測评为主.辅助以简易人才招聘功能的小众功能站点.项目使用了自主研发的人才測评算法以及人格分类模型(与MBTI非常相似). 项目相关网址:sugeladi.ne ...
- initial ram filesystem
1 制作最简单的initramfs 1.1 创建init #include <stdio.h> int main() { printf ("\n"); printf ( ...
- 查看jvm常用命令
jinfo:可以输出并修改运行时的java 进程的opts. jps:与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程号. jstat:一个极强 ...